1

我有一个驱动程序可以直接避免 BSoD 并将 Windows Vista 的屏幕变为黑色,并带有少量彩色点和条纹。之后我在系统上发现了一个内存转储,DbgView 精彩地向我展示了一个堆栈跟踪(说明这可能是一个乱码堆栈并且某些部分可能不正确)。遗憾的是,在堆栈中找到的命令在明显破坏整个事情的代码部分中无处可见。(我可以离开我们的整个例行程序,但不能保留其中的一部分。)

有人知道将调试消息放入内存转储或从串行端口中取出以在外部调试器中读取它们的方法吗?(如果连接了调试器,我的测试系统会停止,但这可能是我对远程连接内核调试的方式和原因知之甚少。)

我想知道我的代码失败的地方,因为浏览代码对我来说似乎很好,有点徒劳,我可能需要一个提示。

4

1 回答 1

3

MSDN中关于如何设置调试会话的描述。

设置过程是:

  1. 设置 2 台 PC,第一台带有您的开发环境,第二台是调试目标。(Vista+Vista64 最适合我)
  2. 使用 Firewire 电缆或 Null-Modem 电缆设置调试器连接。(Null-Modem 几乎总是有效,但从性能的角度来看,Firewire 更好。USB 很贵,而且对我来说开箱即用不是...)
  3. 设置目标计算机以“调试”模式启动MSDN
  4. 让 WinDbg 运行并等待内核连接,以调试模式启动目标计算机。
  5. 启动时,WinDbg 应该打印有关目标系统的消息。在这里您将看到 DbgPrint 消息等。(所有 DbgPrint 在 Vista 中默认禁用(不是在 XP 中),您必须启用它链接
  6. 您可以通过定义断点在 WinDbg 中的模块中设置断点。

PS:bcdedit 有时无法设置调试模式。我不知道为什么。但是似乎有一定的顺序,你必须告诉它调试参数。尝试不同的组合确实可以创造奇迹......

当你闯入进程时,你可以在 WinDbg 中使用命令。几个有趣的:

  • lm显示当前加载的所有模块
  • lm m 模式显示所有满足搜索条件的模块(例如“lm m kernel32*”
  • x module_name!function_name_pattern列出模块中的符号(例如“kernel32!Create*”)
  • bl列出所有当前设置的断点
  • bp module_name!function_name在指定函数的开头设置断点。
  • bc * 删除所有断点
  • .hh bp显示“bp”的帮助
  • .reload /u x.sys重新加载 x.sys 模块调试设置。(当您想要重建项目并收到“无法创建 x.pdb ...”消息时,这很有帮助)。

在 Vista 下启用所有 DbgPrint 输出:

enable_dbg_print_vista.reg

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Debug Print Filter]
"DEFAULT"=dword:0000000f
于 2009-07-27T20:38:59.440 回答