当我通过ntsd -d
将windbg -k
传递给目标时,我无法在windbg中显示源代码,但是当我在本地调试时它可以正常工作。
我想调试Winlogon.exe和LSASS.exe的第一个代码执行。但是为了便于重现这个问题,我做了这个设置:
/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
在每个选项中,我都可以看到符号(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\
任何文件,但我无法使用该文件来设置断点。如何查看在.open
到ntsd -d
下运行的流程的DLL源代码?
答案 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.
通过执行以下操作: