我想调试我的C++应用程序。它需要几个命令行参数。我知道我可以在“项目属性”对话框中指定它们,但是我正考虑将调试器附加到我将用于运行程序的控制台进程。Visual Studio 2010通过“附加到进程”调试C++控制台应用程序
这可能吗?即使我在调试 - >选项和设置中指定了符号目录,当我尝试时,VS不加载符号(制动点将不会被点击,没有符号被加载到这个文件中))。
主动配置是调试。用/ ZI编译并与/ DEBUG和/ ASSEMBLYDEBUG链接。优化禁用。
谢谢。
我想调试我的C++应用程序。它需要几个命令行参数。我知道我可以在“项目属性”对话框中指定它们,但是我正考虑将调试器附加到我将用于运行程序的控制台进程。Visual Studio 2010通过“附加到进程”调试C++控制台应用程序
这可能吗?即使我在调试 - >选项和设置中指定了符号目录,当我尝试时,VS不加载符号(制动点将不会被点击,没有符号被加载到这个文件中))。
主动配置是调试。用/ ZI编译并与/ DEBUG和/ ASSEMBLYDEBUG链接。优化禁用。
谢谢。
“附加到进程”通常用于在程序已经运行后附加到您的程序。
这听起来像你试图附加到命令提示符,它将启动你的程序。这是一个不同的过程,当附加到cmd.exe
时,您将得到各种警告,因为它不包含调试信息。但是,如果您启用了“也调试子进程”选项,那么一旦启动程序,调试器将在那时安装断点。
阅读也:Can Visual Studio be made to debug child processes like WinDBG?
我想你也能做到这一点动态。在主
#include <atlbase.h>
#pragma warning(disable : 4278)
#pragma warning(disable : 4146)
//The following #import imports EnvDTE based on its LIBID.
#import "libid:80cc9f66-e7d8-4ddd-85b6-d9e6cd0e93e2" version("8.0") lcid("0") raw_interfaces_only named_guids
//The following #import imports EnvDTE80 based on its LIBID.
#import "libid:1A31287A-4D7D-413e-8E32-3B374931BD89" version("8.0") lcid("0") raw_interfaces_only named_guids
//The following #import imports EnvDTE90 based on its LIBID.
#import "libid:2ce2370e-d744-4936-a090-3fffe667b0e1" version("9.0") lcid("0") raw_interfaces_only named_guids
//The following #import imports EnvDTE100 based on its LIBID. - This doesn't work for me
//#import "libid:26ad1324-4b7c-44bc-84f8-b86aed45729f" version("10.0") lcid("0") raw_interfaces_only named_guids
#pragma warning(default : 4146)
#pragma warning(default : 4278)
然后somhere:我对C++共享代码:
Somwhere附近开始
CoInitialize(NULL);
CComPtr<EnvDTE::_DTE> m_pDTE;
CComPtr<EnvDTE80::DTE2> m_pDTE2;
CLSID clsid;
CLSID clsid2;
CLSIDFromProgID(L"VisualStudio.DTE.10.0",&clsid);
CLSIDFromProgID(L"VisualStudio.DTE.10.0",&clsid2);
CComPtr<IUnknown> punk;
CComPtr<IUnknown> punk2;
// Get a running instance of Visual Studio.
HRESULT hr = GetActiveObject(clsid,NULL,&punk);
hr = GetActiveObject(clsid2,NULL,&punk2);
m_pDTE = punk;
m_pDTE2 = punk2;
EnvDTE::DebuggerPtr p_dbg;
while(FAILED(m_pDTE2->get_Debugger(&p_dbg)))
{
}
bool Sucess = false;
do
{
EnvDTE::ProcessesPtr p_processes;
while(FAILED(p_dbg->get_LocalProcesses(&p_processes)))
{
}
long max;
if(FAILED(p_processes->get_Count(&max)))
{
std::cerr << "Failed to obtain process count.";
return 2;
}
for(long i = 0; i < max; ++i)
{
EnvDTE::ProcessPtr p_process;
// Get item and check for process id if any
if(FAILED(p_processes->Item(variant_t(i), &p_process)))
continue;
if(p_process != nullptr)
{
long process_id;
while(FAILED(p_process->get_ProcessID(&process_id)))
{
}
if(process_id == GetProcessId(GetCurrentProcess()))
{
p_process->Attach();
Sucess = true;
break;
}
}
}
} while(!Sucess);
希望它会帮助别人。
嗨,谢谢。 “调试子进程”选项到底在哪里? – Petr 2011-03-20 04:43:39
@Petr:你看过链接了吗? – 2011-03-20 04:58:06
是的,它似乎实际上不存在,这就是为什么我问。 – Petr 2011-03-20 05:07:33