【问题标题】:Visual Studio 2010 Debugging C++ Console Application by "Attach to process"Visual Studio 2010 通过“附加到进程”调试 C++ 控制台应用程序
【发布时间】:2012-07-08 11:56:28
【问题描述】:

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

这可能吗?

当我尝试时,即使我在 Debug->选项和设置。

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

谢谢。

【问题讨论】:

    标签: visual-studio-2010 debugging symbols


    【解决方案1】:

    我认为您也可以动态执行此操作。我分享 C++ 的代码:

    接近开头的地方:

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

    然后在主要的地方:

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

    希望它对某人有所帮助。

    【讨论】:

      【解决方案2】:

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

      听起来您正在尝试附加到将启动您的程序的命令提示符。这是一个不同的过程,当附加到cmd.exe 时,您会收到各种警告,因为它不包含调试信息。

      但是,如果您启用了“同时调试子进程”选项,则一旦您启动程序,调试器就会在那时安装断点。

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

      【讨论】:

      • 您好,谢谢。 “同时调试子进程”选项到底在哪里?
      • 是的,看起来它实际上不存在,这就是我问的原因。
      • @Petr:您的选项在其他线程中非常清楚地概述:(1)您可以使用 WinDbg。 (2) 您可以安装模拟该选项的第三方宏。 (3) 您可以使用注册表让 Windows 在程序启动时启动调试器。
      猜你喜欢
      • 2023-04-05
      • 2016-04-11
      • 1970-01-01
      • 2012-09-18
      • 2012-01-11
      • 2013-02-24
      • 1970-01-01
      • 2023-03-17
      • 2014-09-30
      相关资源
      最近更新 更多