使用gdb附加到尚未启动的进程

时间:2014-05-18 18:36:28

标签: c++ c windows gdb cygwin

我正在调试一个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

2 个答案:

答案 0 :(得分:0)

您可以指示Windows在启动时在调试器下自动运行某些进程。这是通过创建类型为HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\<whatever.exe>\Debugger的注册表值REG_SZ来完成的,其中包含您要用作调试器的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/

答案 1 :(得分:0)

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

步骤: 1)构建自己的cygwin1.dll副本,如下所述:http://cygwin.com/faq.html#faq.programming.building-cygwin。添加&#34; - 启用 - 调试&#34;配置时标记。

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

3)设置环境变量CYGWIN_DEBUG =,其中是您尝试调试的程序的名称。请注意,Cygwin基本上使用&#34;包含&#34;方法在这里,我想。因此,只要您尝试启动名称包含您在CYGWIN_DEBUG变量中放入的字符串的程序,它就会启动gdb会话

注意事项:

1) - 启用调试开关会使您的应用程序运行速度非常慢,并且不完全稳定。

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