繁体   English   中英

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

[英]Using gdb to attach to a process that is yet not started

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

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

注意

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

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

我尝试了什么

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

这种方法的问题是,gflags调用调试器时使用映像名称,后跟命令行参数,因为gdb要求使用命令行参数的PID或映像名称。 参考如何在gdb中附加进程

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

参考文献:

  1. http://msdn.microsoft.com/zh-CN/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)构建自己的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM