2011-03-20 91 views
1

我想调试我的C++应用程序。它需要几个命令行参数。我知道我可以在“项目属性”对话框中指定它们,但是我正考虑将调试器附加到我将用于运行程序的控制台进程。Visual Studio 2010通过“附加到进程”调试C++控制台应用程序

这可能吗?即使我在调试 - >选项和设置中指定了符号目录,当我尝试时,VS不加载符号(制动点将不会被点击,没有符号被加载到这个文件中))。

主动配置是调试。用/ ZI编译并与/ DEBUG和/ ASSEMBLYDEBUG链接。优化禁用。

谢谢。

回答

1

“附加到进程”通常用于在程序已经运行后附加到您的程序。

这听起来像你试图附加到命令提示符,它将启动你的程序。这是一个不同的过程,当附加到cmd.exe时,您将得到各种警告,因为它不包含调试信息。但是,如果您启用了“也调试子进程”选项,那么一旦启动程序,调试器将在那时安装断点。

阅读也:Can Visual Studio be made to debug child processes like WinDBG?

+0

嗨,谢谢。 “调试子进程”选项到底在哪里? – Petr 2011-03-20 04:43:39

+0

@Petr:你看过链接了吗? – 2011-03-20 04:58:06

+0

是的,它似乎实际上不存在,这就是为什么我问。 – Petr 2011-03-20 05:07:33

4

我想你也能做到这一点动态。在主

#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); 

希望它会帮助别人。

相关问题