内存转储中的DbgPrint?

时间:2009-07-27 13:21:42

标签: windows debugging device-driver kernel

我有一个直接避免BSoD的驱动程序,并将Windows Vista的屏幕变成黑色,几乎没有彩色圆点和条纹。我之后在系统上找到了一个内存转储,DbgView很好地向我展示了一个堆栈跟踪(声明这可能是一个乱码堆栈,而某些部分可能不正确)。遗憾的是,在代码中发现堆栈中的命令无处可见,这显然会破坏整个事物。 (我可以完成整个程序,但不能完成它的一部分。)

有人知道如何将调试消息发送到内存转储或串行端口以在外部调试器中读取它们吗? (如果调试器已连接,我的测试系统会停止,但这可能让我对远程连接内核调试的方式和原因了解不够。)

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

1 个答案:

答案 0 :(得分:3)

MSDN关于如何设置调试会话的说明。

设置程序为:

  1. 设置2台PC,第一台是您的开发环境,第二台是调试目标。 (Vista + Vista64最适合我)
  2. 使用Firewire电缆或Null-Modem电缆设置调试器连接。 (Null-Modem几乎总是有效,但Firevire从性能的角度来看更好.USB价格昂贵,而且开箱即用......)
  3. 将目标计算机设置为以“调试”模式MSDN
  4. 启动
  5. 让WinDbg运行并等待内核连接,以调试模式启动目标计算机。
  6. 启动时,WinDbg应该打印有关目标系统的消息。在这里您将看到DbgPrint消息等。(在Vista中默认禁用所有DbgPrint(不在XP中),您必须启用它link
  7. 您可以通过定义断点在WinDbg中的模块中设置断点。
  8. PS:bcdedit有时无法设置调试模式。我不知道为什么。但似乎有一定的顺序,你必须告诉它调试参数。尝试不同的组合确实可以创造奇迹......

    当您进入流程时,可以在WinDbg中使用命令。一些有趣的:

    • lm 显示当前加载的所有模块
    • lm m pattern 显示满足搜索条件的所有模块(例如“lm m kernel32 *”
    • x module_name!function_name_pattern 列出模块中的符号(例如“kernel32!Cre​​ate *”)
    • 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