【问题标题】:Using gdb to attach to a process that is yet not started使用 gdb 附加到尚未启动的进程
【发布时间】:2014-07-06 16:33:22
【问题描述】:

我正在调试一个 cygwin gcc 编译进程,该进程将通过CreateProcess 从本机 Windows 程序加载。我想在 main 之前设置一个断点,例如在mainCRTStartup

如何附加到尚未加载的进程并在mainCRTStartup处设置断点?

注意

如果这很重要,那不是 XY 问题。我正在分析 Windows 2012 R2 中可能存在的错误,并且需要跟踪从调用 CreateProcess 到加载进程的主入口点传递的整个命令行。在我接触 MS 之前,我需要确定问题出在哪里。

我还需要使用 gdb,因为 WinDBG 可能无法对 cygwin gcc 编译的二进制文件进行源调试。

我尝试了什么

使用 gflags,我尝试在加载图像时调用 gdb,但不幸的是,收到一条消息“文件名太长”,然后在没有任何活动进程的情况下调用 gdb

这种方法的问题是,gflags 使用图像名称后跟命令行参数调用调试器,而 gdb 需要 PID 或不带命令行参数的图像名称。参考How to attach a process in gdb

【问题讨论】:

  • 您将如何对不存在的进程执行任何操作?这很简单:你不能。你介意告诉我们为什么你会想要这样做吗? (请阅读the XY problem。)
  • @JoachimPileborg:不是the XY problem。我正在分析 Windows 2012 R2 中可能存在的错误,并且需要跟踪从 CreateProcess 调用到主入口点传递的整个命令行。在我接触 MS 之前,我需要确定问题出在哪里。
  • 你没有告诉我们为什么你想做你想做的事,你只是想知道如何让你当前的解决方案发挥作用。所以确实是一个XY问题。现在我们至少知道您想做什么,并且有知识的人将能够说出您想要的解决方案是否可行,或者是否有其他解决方案(以前没有人能做到的最后一个解决方案)。
  • 你一定要使用gdb吗?如果您只需要检查命令行参数,也许您可​​以使用 WinDbg 完成工作(通过将其设置为使用 GFlags 的进程调试器,或者附加到父进程并运行 .childdbg 1)。
  • @AndrewMedico:WinDBG 可以用源代码调试 cygwin gcc 编译的二进制文件吗?

标签: c++ c windows gdb cygwin


【解决方案1】:

您可以指示 Windows 在启动时自动在调试器下运行某些进程。这是通过创建一个 REG_SZ 类型的注册表值 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\<whatever.exe>\Debugger 来完成的,其中包含要用作调试器的 gdb 可执行文件的完整路径/名称。

参考资料:

  1. http://msdn.microsoft.com/en-us/library/a329t4ed(vs.71).aspx
  2. http://bugslasher.net/2011/03/26/how-to-debug-a-process-as-soon-as-it-starts-with-windbg-or-visual-studio-2010/

【讨论】:

  • 我相信我使用 gflags 尝试过类似的事情,但收到一条消息“文件名太长”,然后在没有任何活动进程的情况下调用 gdb :-(
  • 这种方法的问题是,gflags 使用图像名称后跟命令行参数调用调试器,其中 gdb 需要 PID 或不带命令行参数的图像名称,请参考 How to attach a process in gdb
【解决方案2】:

嗯,我认为你实际上可以做到这一点。如果你愿意付出一些努力。

步骤: 1) 构建您自己的 cygwin1.dll 副本,如下所述:http://cygwin.com/faq.html#faq.programming.building-cygwin。配置时添加“--enable-debugging”标志。

2) 用你自己的副本替换现有的 cygwin1.dll,如下所述:https://cygwin.com/faq.html#faq.setup.snapshots(显然你不会做 tar 的东西)

3) 设置环境变量 CYGWIN_DEBUG=,其中是您要调试的程序的名称。请注意,我认为 Cygwin 在这里基本上使用了“包含”方法。因此,每当您尝试启动名称包含您放入 CYGWIN_DEBUG 变量中的字符串的程序时,它都会启动 gdb 会话

注意事项:

1) --enable-debugging 开关会使您的应用运行非常缓慢,而且并不完全稳定。

请看这里:http://cygwin.com/ml/cygwin/2014-05/msg00316.html

【讨论】:

    猜你喜欢
    • 2019-04-30
    • 2011-12-31
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 2016-10-30
    • 2021-02-16
    • 2015-09-21
    相关资源
    最近更新 更多