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

时间:2011-06-10 18:15:09

标签: dll windbg remote-debugging

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

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

  • 我使用CrashMe sample application,预先构建了源代码和符号,并将其复制到目标和主机上的C:\ CrashMe
  • 我到处使用Windows调试工具(DTW)版本6.12.0002.633。
  • 目标是运行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  

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

  1. 通过-server-remote
  2. 进行调试
  3. 打破正在运行的过程
  4. 使用图像文件执行选项(IFEO)。
  5. 在每个选项中,我都可以看到符号(x crashme!*有效)。

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

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

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

    如何查看在.openntsd -d下运行的流程的DLL源代码?

1 个答案:

答案 0 :(得分:1)

TL; DR:使用-server&lt; TRANSPORT&gt; -ddefer并通过第二个windbg会话连接,该会话设置了.lsrcpath以获得你想要的东西。

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

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

通过执行以下操作:

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