只有一个工具合适—调试 Win9x 程序

今天我们来聊一聊我最近在 Windows 98 上使用 Turbo Debugger, VC++ 6.0,以及 OllyDbg 1.10 三款工具调试代码的体验,读者朋友不妨猜一下,到底是哪款工具合适。

Turbo Debugger

我是用的版本是 Borland C++ 5.02 附带的版本,看到这个蓝底白边的 UI,不晓得你是觉得亲切,还是头痛:

虽然是 windows 版,但是 Turbo Debugger 的界面还活在 DOS 时代,不过这并不影响使用,常来的读者知道,我们之前用 Turbo Debugger 分析过另一款游戏。 所以这次分析 Red2001 时,我没怎么思索就选择了它,然后 step over 调试时就遇到了问题:

这个只是卡死,根据显示设置的不同,有时是全黑,总之是系统卡住:

我当时调试时屏幕突然全白,然后卡死

ctrl-alt-del 可以弹出结束任务窗口,但是无法切换回 Turbo Debugger 或桌面,只能选择终止程序回到桌面。

不晓得问题出在哪里,经过多次试验失败后,我选择换一个工具调试:VS6.0。

VS 6.0

简单剧透一下,这是我用的时间最短的工具,其实我应该更倾向于用这个工具,多年在 VS 中的摸爬滚打,让我已经习惯了 F9 下断点,F5 执行的操作,不过我这次选择 VS 并不是因为这个,而是因为我知道这是一个 MFC 程序,或者起码是用了 MFC 的程序。所以我想,用同一家的东西可能更适合,因为开发者可能用的也是同样的东西。

不过很快我的 VS 也遇到了相同的卡死(当时也是白屏),让人非常绝望。

VS 的使用就到这里,不过在介绍下一款工具之前,我还有两点可以展开一下,姑且把它们也算作 VS 给我的提示好了。

1. 白屏到底是什么,程序是否正常?

白屏其实很好猜,是游戏在设置屏幕,然后调试器又在某步中断了程序。这个游戏没有窗口模式,任何分辨率下,都是切到 640×480 全屏。有一次我没下断点直接在 VS 运行了游戏,一直到开始画面也没有问题,让我意识到:游戏显示在最上方,却又被调试器中断,而我们又切不到调试器的界面,这就是我们当前的局面。

2. 为什么不能切换到调试器

其实有两层原因:

  1. 我的 86Box 抓不到 Alt+Tab,即使已捕获键鼠,Alt+Tab 还是会被 Win11 抓到。对于这一点,我的对策是找一个 Win98 下面能用的 AHK,把切窗口转移到其它键位。
  2. 白屏时无法切换窗口,即使 AHK 转移了键位,也是没有反应。

这下我基本没有对策了,可以想到的方法是配一个远程调试的环境,不过想想就又是一番腥风血雨。所以我想起了另一个很多人推荐的工具:Ollydbg。

OllyDbg 1.10

本着死马当活马医的原则,我给我的 Win98 又装了这个工具,很多人都推荐,一定有他的道理,对不对:

这个界面一看就是来自现代,舒服很多,而且能在 Win98 上运行,已经很神奇了,而且我点来点去发现,它还有一个解决我们痛点的功能:

这下我们终于可以安心调试代码了,因为白屏时,OllyDbg 也在屏幕最顶端。

总结

我想你应该知道我的答案了,是的,这次我是用 OllyDbg 找到了 Red2001 游戏脚本的解法,有种相见恨晚的感觉,如果没有 OllyDbg,红楼梦十二金钗系列可能就少了不少有意思的事情

不过目前我觉得有一个潜在问题,我没有找到工作目录的设置方式,Turbo Debugger 和 VS Studio 都是可以设置的,但是 OllyDbg 没有,不过 OllyDbg 默认把 exe 的所在目录当成了工作目录,所以目前这个问题还不存在。话说回来,如果有其他应用可以把其他调试器的窗口也置顶,那它们应该也可以值得一战,不过相比安装和使用的便捷情况,我也还是推荐 OllyDbg,因为它不用安装,拷过去就用了。

本文只说了 OllyDbg 可以通过强制在最前的方式解决程序假死的问题,好像就这么判定 OllyDbg 就是第一有点武断,使用中我是觉得 OllyDbg 挺舒服的,有其他选项的话,也欢迎来比较一下。

只有一个工具合适