我想启动一个采用命令行的进程。使用gflags我想启用页面堆,并允许windbg在每次启动时附加到进程。
如何在gflags UI中添加命令行参数?
答案 0 :(得分:2)
你没有。你混淆了很多不相关的东西。
要启用堆验证(“PageHeap”),您可以使用GFlags实用程序设置所需的配置,使用GUI或向其传递适当的命令行参数(请参阅{{3} })。无论哪种方式,这都将为所有具有您定义名称的二进制文件设置为全局。
要在每次启动时在调试器下运行程序,您可能希望使用“映像文件执行选项”下的“调试器”设置。您也可以使用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
之后的所有内容传递给目标程序(如上所述GFlags and PageHeap)。
所以你看,没有必要为你正在调试的程序设置命令行参数,无论你在哪里运行它。
PageHeap和IFEO \ Debugger之间的唯一联系是你可以通过GFlags实用程序控制它们。
注意使用IFEO \ Debugger的所有常见注意事项。例如:
CreateProcess
获取WinDbg的句柄,而不是目标进程(以及进程ID等)。STARTUPINFO
参数中的任何信息都适用于WinDbg,而不是目标进程。我估计lpEnvironment
也是如此。如果这对你影响不大。如果是,则替代方案可能是在程序开头添加未处理的异常,并将WinDbg设置为事后调试器(AeDebug
)