我正在尝试使用WinDBG并在ASM中编写一个简单的hello世界(在Windows XP上运行)。
现在我有点惊讶,当我运行它时,当我加载进程时,WinDBG总是在ntdll中停止:
ntdll!DbgBreakPoint:
7c90120e cc int 3
7c90120f c3 ret
通常我会期望调试器在新进程的第一条指令处停止,而不是在内核中的某处。现在我可以使用:
bp start
其中start
是我的切入点。但我必须手动完成这项工作。有没有办法指示WinDBG它应该在我的程序中开始调试而不是其他的?为什么不自动执行此操作?我也注意到了GDB中的相同行为,但至少GDB自动似乎在main()
中设置了一个breakpint(至少对于C程序)。
答案 0 :(得分:1)
当Windows中的调试器启动时,程序不会在入口点停止,而是在入口点之前执行的系统DLL中的启动代码处停止!
(但是,调试器首先停在DbgBreakPoint上,这是不常见的!)
当您停止已经运行的进程时,会创建一个调用DbgBreakPoint的新线程。调试器比在该地址停止。
答案 1 :(得分:1)
您的workspace应该保存您的断点,这样您下次就不需要输入它了。
我能想到达到你想要的唯一方法是在启动windbg时传递一个命令行参数:
windbg -g "C:\myApp\myapp.exe"
这告诉windbg忽略ntdll
中的初始断点,然后它应该在start
中击中断点。