我想启动一个需要命令行的进程。我想使用 gflags 启用页堆并允许 Windbg 在每次启动时附加到进程。
如何在 gflags UI 中添加命令行参数?
最佳答案
你不知道。而且你混淆了一些非常不相关的事情。
页面堆
要启用堆验证(“PageHeap”),您可以使用 GFlags 实用程序设置所需的配置,可以使用 GUI 或向其传递适当的命令行参数(请参阅 GFlags and PageHeap ) 。无论哪种方式,这对于具有您定义名称的所有二进制文件来说都是全局设置。
调试
要在每次启动时在调试器下运行程序,您可能需要使用“图像文件执行选项”下的“调试器”设置。您也可以使用 GFlags 进行设置。勾选“图像文件”选项卡中的“调试器”复选框(指定 EXE 名称并点击选项卡后),然后输入调试器的路径。
此机制的工作方式是,在CreateProcess
内部(某处)会测试是否为您尝试运行的程序设置了 IFEO\Debugger,如果设置了,则无论如何执行调试器值中设置的**并传递原始命令行*。
所以如果你设置
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\foo.exe\Debugger
为 C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe
,然后尝试执行 C:\Users\d_blk\Desktop\foo.exe -param 1 -param 2
,Windows 运行
C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe C:\Users\d_blk\Desktop\foo.exe -param 1 -param 2
WinDbg 将 foo.exe
之后的所有内容传递给目标程序(如 here 所示)。
所以您会看到,无论您在何处运行,都无需为您正在调试的程序设置命令行参数。
PageHeap 和 IFEO\Debugger 之间的唯一联系是您可以通过 GFlags 实用程序控制它们。
注意事项
请注意使用 IFEO\Debugger 的所有常见注意事项。例如:
- 调用者从
CreateProcess
获取 WinDbg 的句柄,而不是目标进程(和进程 ID 等)。 - 非默认
STARTUPINFO
参数中的任何信息都适用于 WinDbg,而不是目标进程。我猜lpEnvironment
也是如此。
如果这对你没有影响那就太好了。如果确实如此,另一种方法可能是在程序开头添加未处理的异常,并将 WinDbg 设置为事后调试器 (AeDebug
)
关于debugging - GFlags - 命令行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35209951/