GFlags - 命令行

GFlags - command lines

我想启动一个使用命令行的进程。使用 gflags 我想启用页面堆并允许 windbg 在每次启动时附加到进程。

如何在 gflags UI 中添加命令行参数?

你不知道。而你混淆了非常不相关的东西。

页面堆

要启用堆验证 ("PageHeap"),您可以使用 GFlags 实用程序设置所需的配置,使用 GUI 或将其传递给适当的命令行参数(参见 GFlags and PageHeap)。无论哪种方式,这都会为所有具有您定义的名称的二进制文件设置全局。

调试

对于 运行 每次启动时都在调试器下运行的程序,您可能希望使用“图像文件执行选项”下的“调试器”设置。您也可以使用 GFlags 设置它。勾选 Image File 选项卡中的 Debugger 复选框(在指定 EXE 名称并点击选项卡后)并输入调试器的路径。

此机制的工作方式是 CreateProcess 内的(某处)测试是否为您尝试 运行 的程序设置了 IFEO\Debugger,如果它已设置,无论在 Debugger 值中设置什么,都会执行 ** 并通过原始命令行*。

所以如果你设置

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\foo.exe\Debugger

成为C:\Program Files (x86)\Windows Kits\Debuggers\x64\windbg.exe然后尝试执行C:\Users\d_blk\Desktop\foo.exe -param 1 -param 2,Windows运行s

C:\Program Files (x86)\Windows Kits\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 设置为 post-mortem 调试器 (AeDebug)