2

我正在尝试使用 WinDBG 并在 ASM 中编写了一个简单的 hello world(在 Windows XP 上运行)。

现在我有点惊讶,当我运行它时,当我加载进程时,WinDBG 总是在 ntdll 中停止:

ntdll!DbgBreakPoint:
7c90120e cc              int     3
7c90120f c3              ret

通常我希望调试器在新进程的第一条指令处停止,而不是在内核中的某个地方。现在我可以使用:

bp start

start我的切入点在哪里。但我必须始终手动执行此操作。有什么方法可以指示 WinDBG 它应该在我的程序中开始调试,而不是其他的?为什么它不自动执行此操作?我也注意到 GDB 的相同行为,但至少 GDB 似乎自动设置了一个断点main()(至少对于 C 程序)。

4

2 回答 2

1

当 Windows 中的调试器启动时,程序不会在入口点停止,而是在入口点之前执行的系统 DLL 中的启动代码处停止!

(然而,调试器首先在 DbgBreakPoint 停止的情况并不常见!)

当您停止一个已经运行的进程时,会创建一个调用 DbgBreakPoint 的新线程。调试器会在该地址处停止。

于 2013-09-30T19:47:09.083 回答
1

您的工作区应该保存您的断点,以便您下次不需要输入它。

我能想到实现你想要的唯一方法是在启动windbg时传递一个命令行参数:

windbg -g "C:\myApp\myapp.exe"

这告诉 windbg 忽略 in 的初始断点ntdll,然后它应该在start.

于 2013-10-01T07:35:39.627 回答