2011-03-20 5 views
1

C++ 응용 프로그램을 디버깅하고 싶습니다. 몇 가지 명령 줄 인수가 필요합니다. 나는 "Project Properties"대화 상자에서 그것들을 지정할 수 있다는 것을 알고 있지만, 프로그램을 실행하는 데 사용할 콘솔 프로세스에 디버거를 연결하려고 생각하고있었습니다.Visual Studio 2010 C++ 콘솔 응용 프로그램 "프로세스에 연결"디버깅

전혀 가능합니까? 내가하려고하면

, VS는 기호로드되지 않습니다 (brakepoint 현재 히트되지 않습니다이. 어떤 기호는이 문서에 대해로드되지 않았다합니다.을) 내가 Debug-> 옵션 설정에서 심볼 디렉토리를 지정하더라도.

활성 구성은 디버그입니다./ZI로 컴파일되고/DEBUG 및/ASSEMBLYDEBUG와 연결됩니다. 최적화가 비활성화되었습니다.

감사합니다.

답변

1

"프로세스에 첨부"는 일반적으로 프로그램이 실행 된 후 프로그램에 첨부하는 데 사용됩니다.

프로그램을 시작할 명령 프롬프트에 연결하려는 것 같습니다. 이것은 다른 프로세스이며, cmd.exe에 연결할 때 디버그 정보를 포함하지 않기 때문에 모든 종류의 경고를 받게됩니다.

그러나 "디버그 하위 프로세스"옵션을 사용하도록 설정 한 경우 프로그램을 시작하면 디버거가 해당 시점에 중단 점을 설치합니다. 또한

읽기 : Can Visual Studio be made to debug child processes like WinDBG?

+0

안녕하세요. "디버그 자식 프로세스"옵션은 정확히 어디에 있습니까? – Petr

+0

@Petr : 링크를 읽었습니까? –

+0

예, 실제로 존재하지 않는 것처럼 보입니다. 그것이 내가 묻는 이유입니다. – Petr

4

나는 당신이 동적으로 그것을 할 수 있다고 생각합니다. 나는 C++ 코드를 공유 :

을 Somwhere 시작 부분 :

#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 주에 :

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

은 누군가가 도움이되기를 바랍니다.

관련 문제