我有一个驱动可以直接避开BSoD,将Windows Vista 的屏幕变成黑色,并带有一些彩色的点和条纹。之后我在系统上发现了一个内存转储,DbgView 向我展示了一个堆栈跟踪(说明这可能是一个乱码堆栈,某些部分可能不正确)。遗憾的是,在堆栈中找到的命令在明显破坏整个事情的代码部分无处可寻。 (我可以离开我们的整个例程,但不能离开它的一部分。)
有人知道一种方法可以将调试消息放入内存转储或从串行端口中取出,以便在外部调试器中读取它们吗? (如果连接了调试器,我的测试系统就会停止,但这可能是我对远程连接内核调试的方式和原因了解不够。)
我想知道我的代码失败的地方,因为浏览代码对我来说似乎很好但有点徒劳,我可能需要提示。
最佳答案
来自 MSDN 的描述关于如何设置调试 session 。
设置过程是:
- 设置 2 台 PC,第一台用于您的开发环境,第二台用于调试目标。 (Vista+Vista64 最适合我)
- 使用火线电缆或零调制解调器电缆设置调试器连接。 (零调制解调器几乎总是有效,但从性能的角度来看,Firewire 更好。USB 很贵,对我来说开箱即用...)
- 设置目标计算机以“调试”模式启动MSDN
- 运行 WinDbg 并等待内核连接,以 Debug模式启动目标计算机。
- 启动时,WinDbg 应该打印有关目标系统的消息。在这里你会看到 DbgPrint 消息等(所有 DbgPrint 在 Vista 中默认是禁用的(不是在 XP 中),你必须启用它 link )
- 您可以通过定义断点在WinDbg中的模块中设置断点。
PS:bcdedit 有时无法设置 Debug模式。我不知道为什么。但是似乎必须按照一定的顺序告诉它调试参数。尝试不同的组合确实会产生奇迹......
当你打入进程时,你可以使用WinDbg中的命令。几个有趣的:
- lm 显示当前加载的所有模块
- lm m pattern 显示所有满足搜索条件的模块(例如“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
关于windows - 内存转储中的 DbgPrint?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1188132/