如何通过ntsd -d在windbg中显示源代码?
当我通过 windbg -k
在目标上传输 ntsd -d
时,我无法使源代码在 Windbg 中显示,但当我在本地调试时它可以工作。
我想调试 Winlogon.exe 和 LSASS.exe 的第一个代码执行。但为了方便重现问题,我进行了以下设置:
- 我使用 CrashMe 示例应用程序,预构建源和符号,复制到目标和主机上的 C:\CrashMe
- 我在任何地方都使用 Windows 调试工具 (DTW) 版本 6.12.0002.633。
- 目标运行Windows XP SP3,主机运行Windows 7 Ultimate。
- 两台机器上的每个路径和设置都是相同的:DTW 的路径和 crashme 的路径。
- 我总是使用完全限定路径(如 c:\dtw\ntsd.exe)。
- 我在虚拟机中运行 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
),因为我想调试身份验证提供程序的启动代码,所以我需要在 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
任何文件,但无法使用该文件设置断点。 - 我可以检查(检查)任何
- 我看不到源代码的符号。
如何通过 windbg -k
查看在 ntsd -d
下运行的进程的 DLL 源代码?
I can't make source code show in windbg when I pipe ntsd -d
on the target through windbg -k
, but it works when I debug locally.
I want to debug the very first code execution of Winlogon.exe and LSASS.exe. But to make it easy to reproduce the problem, I made up this setup:
- I use the CrashMe sample application, with source and symbols pre-built, copied to C:\CrashMe on both the target and host
- I use Windows Debugging tools for Windows (DTW) version 6.12.0002.633 everywhere.
- The target is running Windows XP SP3, the host Windows 7 ultimate.
- Every path and settings is the same on both machine : path to DTW and path to crashme.
- I always use fully qualified path (like c:\dtw\ntsd.exe).
- I run a XP in a VM, booted with
/noexecute=optin /fastdetect /debug /debugport=com1 /baudrate=115200
I am able to debug locally with this command, launched from C:\CrashMe:
windbg -g -G -srcpath C:\CrashMe -y C:\CrashMe debug\CrashMe.exe
I can launch the Windows XP virtual machine and connect to it with this command:
windbg -n -k com:pipe,port=\\.\pipe\com_1,reconnect -srcpath SRV*;C:\CrashMe -y
c:\windows\system32;c:\windows\symbols;C:\CrashMe\debug
But I need to debug a remote machine. On the target, I have these choices:
- Debug through
-server
and-remote
- Breaking in a running process
- Use Image File Execution Options (IFEO).
In each of these options I can see the symbols (x crashme!*
works).
I cannot use #1 (-server
) or #2 (breakin.exe <pid>
), because I want to debug the startup code of an authentication provider, so I need LSASS.exe
start under ntsd -d
. I can't let it run and attach later on.
My understanding is that I need to use IFEO. Using gflags.exe instead of modifying the registry manually, I set executable options to
c:\dtw\ntsd -d -G -lines -x -y c:\symcache;c:\windows\system32 -n -srcpath C:\CrashMe\
- I can breakin the application, but breakpoints I set are never hit.
- I can
.open
any file, but I can't use the file to set breakpoint. - I can x (examine) any symbol
- I can not see the source code.
How can I see my DLL source code of a process running under ntsd -d
through windbg -k
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
TL;DR:使用 -server-ddefer 并通过第二个 Windbg 会话进行连接,该会话设置了 .lsrcpath 以获取您想要的内容。
其余的部分:
源模式需要从运行调试器的系统访问源文件。在通过内核模式连接调试用户模式代码的情况下,这变得很棘手。由于测试是在目标机器上的 ntsd 上下文中执行的,并且该机器已进入调试器,因此加载源文件通常不起作用。我相信,如果您在目标计算机上放置完整的源代码树或将源路径指向共享,则可能会发生这种情况,但我尚未验证这一点。
我验证的是 您可以使用此方法将源文件加载到您的主机中
这是通过执行以下操作来实现的:
TL;DR: Use -server <TRANSPORT> -ddefer and connect through a second windbg session that has .lsrcpath set to get what you want.
The rest:
Source mode requires access from the system running the debugger to the source files. In the case of debugging user mode code over the kernel mode connection, this becomes tricky. Since the test is executing in the context of ntsd on the target machine, and that machine is broken into the debugger, loading source files generally doesn't work. I believe if you put a full source tree on the target machine or pointed the source path to a share, it might, but I haven't verified that.
What I did verify is that you can use this method to get source files loaded in your host machine.
This works by doing the following: