【问题标题】:Debugging application when launched via ShellExecute通过 ShellExecute 启动时调试应用程序
【发布时间】:2010-11-30 06:00:28
【问题描述】:

我正在尝试通过ShellExecute() API 调用启动应用程序。此应用程序仅包含一个 main 函数,该函数进行一些处理并退出。

现在我将DebugBreak() 放在main 的开头。当调用ShellExecute() 时,应用程序启动成功,但它不要求中断。

当使用ShellExecute()从其他应用程序启动时,如何调试我的应用程序?

我正在使用 VC++。

【问题讨论】:

    标签: winapi debugging visual-c++


    【解决方案1】:

    如果DebugBreak() 不适合您,请尝试_CrtDbgBreak()。请注意,_CrtDbgBreak 仅适用于调试版本。

    _CrtDebugBreak 绝对适合我在启动时中断启动的进程,尽管我很确定 DebugBreak 也可以。

    请注意,这两个函数都会使进程看起来像是崩溃了,因为它们会引发异常。这是正常的,让您有机会通过崩溃对话框附加调试器。 (崩溃对话框还可以让您终止进程;显然不要使用它。)

    另外请注意,如果您的 main 周围有一个包罗万象的 SEH 异常处理程序,那么 DebugBreak 和朋友引发的异常将被吞没,应用程序将直接退出,而不显示崩溃对话框或让您附加到它。

    【讨论】:

      【解决方案2】:

      你不能用 VC++ 做到这一点;对于 WinDbg,这只是 .childdbg 1 来调试所有子进程。使用 VC++,您可以在紧要关头使用图像文件执行选项 - 查看 http://codereflect.com/2009/09/20/how-to-debug-child-process-using-windbgvisual-studio/ 了解更多信息。不过真的,如果你有时间学习 WinDbg,那会更好。

      【讨论】:

        【解决方案3】:

        你可以试试这个,在xp系统下没问题。

        app.exe 是您的应用程序名称,

        -s1...-s3 是命令行参数。

        HINSTANCE hRet = ShellExecute(NULL, L"open", L"vsjitdebugger.exe", L" app.exe -s1 a1 -s2 a2 a3 -s3", szExePath, SW_SHOW);

        【讨论】:

          【解决方案4】:

          【讨论】:

            【解决方案5】:

            我用于此类事情的方法是嵌入一些交互式代码,您可以在之后删除、注释掉或有条件地启用这些代码。在少数情况下,我们通过查询由启动主应用程序的工具设置的环境变量来启用此代码。这允许我单击一个复选框,点击启动并在几秒钟内打开断点对话框。

            if (MessageBox(NULL, 
                           _T("Attach the debugger now, then choose Yes to hit a breakpoint"), 
                           _T("Attach Debugger"), 
                           MB_YESNO) == IDYES)
                __debugbreak();
            

            这使您能够在对话框出现时附加调试器以及是否命中断点的选项。我的早期版本没有给我选项,过了一段时间我意识到有时我想要断点,有时我没有。

            【讨论】:

              猜你喜欢
              • 2010-11-17
              • 2012-05-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-08-31
              • 1970-01-01
              • 2013-05-31
              相关资源
              最近更新 更多