【问题标题】:DbgPrint in Memory Dump?内存转储中的 DbgPrint?
【发布时间】:2010-11-14 08:38:01
【问题描述】:

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

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

我想知道我的代码失败的地方,因为在我看来浏览代码似乎没什么用,我可能需要提示。

【问题讨论】:

    标签: windows debugging device-driver kernel


    【解决方案1】:

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

    设置过程是:

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

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

    当你闯入进程时,你可以在 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
    

    【讨论】:

    • 感谢您保持我的希望。原来我的主要问题是我没有足够地按下“Go”。因此,我的测试系统似乎被调试系统中的一个空调试器窗口冻结了。看起来有点没用。 (但是您的命令列表对于进入它非常有帮助。)我会添加 k,kb, kp, kd 以获得回溯和 u,uf,... 用于反汇编的命令。
    • 另外,我必须在被测机器上运行 DbgView,否则我的 DbgPrint 都不会显示在内核调试器中。可悲的是,当 Dbgview 运行时,整个设置有时会冻结。我可能必须在主机上打开一些标志....
    猜你喜欢
    • 2016-04-24
    • 1970-01-01
    • 2014-02-02
    • 2017-10-06
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多