如何通过ntsd -d在windbg中显示源代码?

Posted

技术标签:

【中文标题】如何通过ntsd -d在windbg中显示源代码?【英文标题】:How do I show source code in windbg through ntsd -d? 【发布时间】:2011-09-12 17:15:18 【问题描述】:

当我通过windbg -k 在目标上传送ntsd -d 时,我无法在windbg 中显示源代码,但是当我在本地调试时它可以工作。

我想调试 Winlogon.exe 和 LSASS.exe 的第一个代码执行。但为了便于重现问题,我做了这样的设置:

我使用 CrashMe sample application,预构建源代码和符号,复制到目标和主机上的 C:\CrashMe 我在任何地方都使用适用于 Windows (DTW) 版本 6.12.0002.633 的 Windows 调试工具。 目标是运行 Windows XP SP3,宿主 Windows 7 Ultimate。 两台机器上的每个路径和设置都是相同的:DTW 路径和 crashme 路径。 我总是使用完全限定路径(如 c:\dtw\ntsd.exe)。 我在 VM 中运行 XP,使用 /noexecute=optin /fastdetect /debug /debugport=com1 /baudrate=115200 启动

我可以使用从 C:\CrashMe: 启动的这个命令在本地进行调试:

windbg -g -G -srcpath C:\CrashMe -y C:\CrashMe debug\CrashMe.exe

我可以启动 Windows XP 虚拟机并使用以下命令连接到它:

windbg -n -k com:pipe,port=\\.\pipe\com_1,reconnect -srcpath SRV*;C:\CrashMe -y   
c:\windows\system32;c:\windows\symbols;C:\CrashMe\debug  

但我需要调试远程机器。在目标上,我有以下选择:

    通过-server-remote 进行调试 中断正在运行的进程 使用图像文件执行选项 (IFEO)。

在每个选项中,我都可以看到符号(x crashme!* 有效)。

我无法使用#1 (-server) 或#2 (breakin.exe <pid>),因为我要调试身份验证提供程序的启动代码,所以我需要在ntsd -d 下启动LSASS.exe。我不能让它运行并稍后附加。

我的理解是我需要使用 IFEO。使用 gflags.exe 而不是手动修改注册表,我将可执行选项设置为

c:\dtw\ntsd -d -G -lines -x -y c:\symcache;c:\windows\system32 -n -srcpath C:\CrashMe\ 
我可以中断应用程序,但我设置的断点永远不会命中。 我可以.open任何文件,但我不能使用该文件设置断点。 我可以 x(检查)任何符号 我看不到源代码。

如何查看在ntsd -dwindbg -k 下运行的进程的DLL 源代码?

【问题讨论】:

我还没有找到答案,但这可能与 ntsd 不是图形调试器有关? 在相关说明中,在完全相同的设置下,我可以在 windbg 中使用完整的源代码调试内核驱动程序。 如果您可以调试驱动程序,那么您已经有一个连接,该连接也可以用于调试用户模式代码(即您的应用程序)。 你是对的,我确实使用它。但我无法获得显示的来源! 司机也不行?在这种情况下,您没有正确配置 a.) 源服务器,b.) 驱动程序未在运行调试器的机器上编译(因此路径不同)或 c.) 您的 WinDbg 配置不正确(然后启动 WinDbg Ctrl+P 配置源路径或-srcpath <path> 在命令行)。 【参考方案1】:

TL;DR:使用 -server -ddefer 并通过设置了 .lsrcpath 的第二个 windbg 会话进行连接以获得您想要的。

其余的: 源代码模式需要从运行调试器的系统访问源文件。在通过内核模式连接调试用户模式代码的情况下,这变得很棘手。由于测试是在目标机器上的 ntsd 上下文中执行的,并且该机器被分解到调试器中,因此加载源文件通常不起作用。我相信如果你在目标机器上放置一个完整的源代码树或者将源路径指向一个共享,它可能会,但我还没有验证。

我验证的是you can use this method to get source files loaded in your host machine.

这通过执行以下操作来工作:

    启动主机内核调试器 使用(例如)`ntsd -server tcp:port=50000 -ddefer test.exe` 在目标计算机上启动 ntsd 开始连接到您的调试服务器(例如,在 WinDbg 中,我使用 ctrl+r `tcp:port=50000,server=tawnos-target`) 连接将挂起。切换到您的内核调试器(应该位于 Input> 处)并运行 `.sleep 5000` 以完成连接 此时,您的远程连接应该完成。您现在可以根据需要重新加载符号并使用 .lsrcpath 设置 windbg 将使用的 srcpath 以查看源代码

【讨论】:

你说得对,使用-server 适用于常规用户模式进程。我在我的(长)帖子中提到了它。但是我如何使用-server选项来调试我自己无法启动的lsass或winlogon? 如果我没记错的话,这会起作用(我可以在这个星期一测试)。将-server-ddefer 结合使用,而不仅仅是使用ntsd -d。这将使您既能获得进入初始进程启动的好处,又能获得远程查看源代码的能力。如果我在星期一之前没有收到更多消息,我会核实并报告给你。

以上是关于如何通过ntsd -d在windbg中显示源代码?的主要内容,如果未能解决你的问题,请参考以下文章

java知识总结-24

如何通过IP获取MAC地址?如何通过mac来获取IP地址?

如何理解“不要通过共享内存来通信,而应该通过通信来共享内存”?

如何通过 Windows Azure 通过 GCM 通过唯一 ID 发送特定 Android 设备的通知?

如何通过其他方法识别通过蓝牙扫描的设备

Laravel:如何通过 jQuery 检查用户是不是登录