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

ixe*_*013 28 dll windbg remote-debugging

当我ntsd -d通过管道传输时,我无法在windbg中显示源代码windbg -k,但是当我在本地调试时它可以工作.

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

  • 我使用CrashMe示例应用程序,预先构建了源代码和符号,并在目标和主机上复制到C:\ CrashMe
  • 我到处都使用适用于Windows的Windows调试工具(DTW)版本6.12.0002.633.
  • 目标是运行Windows XP SP3,主机Windows 7终极版.
  • 两台机器上的每个路径和设置都是相同的: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
Run Code Online (Sandbox Code Playgroud)

我可以启动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  
Run Code Online (Sandbox Code Playgroud)

但我需要调试远程机器.在目标上,我有这些选择:

  1. 通过-server和调试-remote
  2. 打破正在运行的过程
  3. 使用图像文件执行选项(IFEO).

在每个选项中,我都可以看到符号(x crashme!*作品).

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

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

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

我怎样才能看到下运行的过程中我的DLL的源代码ntsd -d通过windbg -k

Taw*_*nos 2

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

其余:源模式需要从运行调试器的系统访问源文件。在通过内核模式连接调试用户模式代码的情况下,这变得很棘手。由于测试是在目标机器上的 ntsd 上下文中执行的,并且该机器已进入调试器,因此加载源文件通常不起作用。我相信,如果您在目标计算机上放置完整的源代码树或将源路径指向共享,则可能会发生这种情况,但我尚未验证这一点。

我验证的是,您可以使用此方法将源文件加载到主机中。

这是通过执行以下操作来实现的:

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