我正在调试一个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
答案 0 :(得分:0)
您可以指示Windows在启动时在调试器下自动运行某些进程。这是通过创建类型为HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\<whatever.exe>\Debugger
的注册表值REG_SZ
来完成的,其中包含您要用作调试器的gdb可执行文件的完整路径/名称。
参考文献:
答案 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) - 启用调试开关会使您的应用程序运行速度非常慢,并且不完全稳定。