当我尝试以下步骤时,OpenWatcom 的调试器只是执行二进制文件而不是单步执行它:
File->Open
, 选择可执行Run->Trace Into
如何使用 OpenWatcom 的调试器单步执行程序?
当我尝试以下步骤时,OpenWatcom 的调试器只是执行二进制文件而不是单步执行它:
File->Open
, 选择可执行Run->Trace Into
如何使用 OpenWatcom 的调试器单步执行程序?
好的,Windows XP,OpenWatcom。我正在使用 OpenWatcom 1.9。当试图重现你的问题,我用calc.exe
从Windows XP是针对那些还没有可用的WATCOM调试符号(仅适用于微软的PDB格式,WATCOM不支持在所有)。
从第一步关闭打开的对话框时,我们会得到这样的装配视图。我从那个调用 ( Run -> Until Return
)返回了几次并意识到调用堆栈显示我仍处于加载器阶段。
现在最合乎逻辑的做法是在任何kernel32!BaseThreadInitThunk
一个基本上是任何 Win32 线程(包括进程中的第一个线程)的入口点处中断,但不会导出(而且,请记住,我们没有符号)。有关启动过程的文章,请参阅此处或“Windows Internals”一书。下一个可能的候选ntdll!RtlUserThreadStart
对象也没有导出,因此不可用。
因此,假设您确实没有可用的现代调试器(WinDbg、cdb,更不用说 IDA、Hopper 和朋友),并且不想livekd.exe
从 SysInternals(但是需要最近的dbghelp.dll
)使用,唯一似乎合理的方法是将您的目标可执行文件加载到编辑器中(想到 CFF Explorer)并在入口点放置一个int3
( cc
) 指令,或者简单地将入口点移到别处。在我来说,我选择了覆盖push 70h
(6A 70
)有int3; nop
(CC 90
)。这使我能够在程序开始时中断(尽管不考虑 TLS 回调或类似的东西)。
另一种侵入性较小的方法是使用上面提到的 CFF Explorer 或任何合适的工具来为您提供入口点的 VA。既然我们在谈论 Windows XP,我们就不必担心 ASLR 或类似的问题。
我们案例中的入口点是 RVA 0x12475
,地址转换器将其转换为:
VA 0x1012475
。甜的。现在我们可以尝试让 OpenWatcom 停在这个地址。在此地址(Break -> View All -> Rightclick -> New
,输入地址)设置一个 bpx,然后按F5(对于“Go”)跳过进程的启动阶段,让我们直接进入入口点。
从那里我们可以F8用于进一步的单步执行。而且我确信与我们在启动阶段分享的经验类似,自从调试器上次调整到更新的操作系统后发生的任何小变化都会让您(或者更确切地说是 OW 调试器)绊倒。Break -> On Debug Message
除了切换调试器之外,您可能还想大量使用,但是当我尝试使用它时,即使这样似乎也没什么用。
这是可能的,但它很乏味,并且可能在任何时候都无法满足您的需求。
坦率地说,当没有可用的源代码(汇编调试)时,一些调试器最好不要理会。诚然,我不像 GDB 或 WinDbg 那样熟悉 Watcom 调试器,但我过去使用过它并发现它带有符号的纯粹恐怖。如果没有符号,这种印象可能只会变得更糟。通过调查您遇到的问题,我发现自己在这个意义上得到了证实。
OpenWatcom,虽然仍在“开发”,但已经过时了。它的根源在于旧的 Sybase 产品 Watcom,它拥有广泛的追随者。问题是,该产品甚至在 Windows 2000 之前就已经存在。所以我认为您不能对它抱有太大期望,因为如今大多数人都在使用具有更好支持的编译器和调试器。如果您碰巧使用 MinGW 或类似的东西,无论是 WinDbg 还是 GDB。