windows(win32)上调试Mozilla FAQ
作者: Heikki Toivonen
译者: 徐梓耀
这篇文档尽量回答了在一个32位的微软Windows系统上如何高效的调试Mozilla的最常碰到的问题。 假定你已经知道怎样使用微软的Visual C++集成开发环境和调试器。
这些说明最初是为VC++ 6.0 来写的。我已经开始对其中和VC++7.0 aka Visual Studio .NET 2003 或者更新的 的版本中不同的地方增添内容。VC++ 7.0 的内容还不全面,所以对于VC++ 7.0的有关新的内容请email通知我。
- 基本要求
- 开启调试器的方法
- 为Mozilla创建一个Visual C++工程
- 改变可执行文件到调试状态
- 命令行参数
- 为还未载入内存的动态连接库设置断点
- 显示Unicode 字符串
- 定制调试器的变量值显示窗口
- 禁用断言
- 调试优化后的连接文件
- 同时运行两个Mozilla实例
- 调试JavaScript
- 没有答案的问题和有答案的新问题
基本需求
开启调试器的方法
启动 MSDEV, 选择 文件 > 打开 工作区... (打开 解决方案... 在 VC++ 7.0中) 并选择一个Mozilla可执行文件 这将会创建一个Mozilla工程。可以通过按F5来开始一个调试
命令行方式, 键入 msdev <程序名>. 是否必须在可执行文件所在的目录呢?
运行程序直到遇到一个断言你将会碰到一个对话框,问你是否要调试,点击 "取消"。 MSDEV 的IDE会开启并将断言发生处的文件载入。这样默认设置也会在可执行文件所在的目录创建 一个Visual C++Mozilla工程。
为Mozilla创建一个Visual C++工程
这个也许不能正常工作:
你可能想要在Mozilla的根目录下创建一个Mozilla工程。 可以通过选择 文件 > 打开 工作区... 并打开client.mak. Visual C++ 报告说它无法读取这个工程,你将此忽略。它将让你为即将打开的工程文件命名。 你很可能写成 "mozilla".
如果你选择 文件 > 打开 工作区... (打开 解决方案... 在 VC++ 7.0中) 并选择打开一个可执行文件, VC++ 默认在可执行文件所在的目录创建一个工程。
一旦你得到了工程,选择 "Save All"来保存全部的工作区信息。如果你改变了一些Visual C++ 的选项,你也要做这个操作。
在你开始使用这个工程前,进行一些选项设置是很有必要的,所以继续往下读。
改变可执行文件到调试状态
VC++ 6.0:
改变或者设置可执行文件到调试状态,选择 工程 > 设置..., 调试页 并从下拉菜单中选择 General。 "可执行调试对话:"应该显示处你正在调试的可执行文件。如果它是空的或者不正确 ,使用光标控制键选择 浏览... 来定位可执行文件。
命令行参数
VC++ 6.0:
改变或者设置命令行选项,选择 工程 > 设置..., 调试页并从下拉菜单中选择 General, "程序变量:"应该显示出选项。一些常用的选项是你可能想要浏览器开启后马上打开的文件的URL, 开启 Profile Manager,或者选择一个profile。你也可以重定向控制台输出到一个文件 (比如通过增加 "> filename.txt",不要加引号)。
为还未载入内存的动态连接库设置断点
VC++ 6.0:
选择 工程 > 设置..., 调试页并从下来菜单中选择 "Additional DLLs"。 查看"Locate Additional DLLs" 选项。对于每一个DLL,单击按钮 "New",这样可以创建一个新项,同时点击 按钮 "...",可以浏览DLL。一次只能添加一个DLL。
VC++ 7.0可以自动找到额外的动态链接库。
显示Unicode 字符串
VC++ 6.0:
选择 工具 > 选项..., 找到调试页,查看选项"Display Unicode Strings"。
VC++ 7.0 会自动显示Unicode编码字符串。
定制调试器的变量值显示窗口
可以定制使得Visual C++在变量显示窗口中显示类。默认情况下,VC++显示 "{...}" ,需要点击小图标来扩展成员。可以改变这种行为使得Visual C++显示以任意 的顺序显示任意的数据成员,只要你喜欢就可以替换掉"{...}"。
你需要自己的Visual C++安装目录下定位一个名为 "AUTOEXP.DAT"的文件。默认它在:
VC++ 6.0:
C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\AUTOEXP.DAT
VC++ 7.0:
C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Packages\Debugger\AUTOEXP.DAT
这个文件的开头包含了有关格式的一些信息,经过少许练习你应该可以熟悉它。下面是一些 项目条,希望它们可以是你的工作更加容易:
;; Mozilla nsAutoString=<mStr,su> nsString=<mStr,su> nsCString=<mStr,s> nsRect=x=<x,d> y=<y,d> width=<width,d> height=<height,d> nsIAtom=<mString,su> nsCOMPtr<*>=<mRawPtr,x>
在你进行了上述改变并保存了文件后,需要重启Visual C++以使得所做的改变生效。
禁用断言
有两种基本的方法可以禁用断言:一种需要设置一个环境变量,而另一种只对当前内存中运行的程序例程起作用。
环境变量
有一个环境变量可以禁用断言的断点。你通常对它设置如下:
set XPCOM_DEBUG_BREAK=warn
环境变量除了warn之外可以接受其他的值。查看 Unix 调试 FAQ 来获取更加详细的信息。注意,和Unix不一样,windows的默认值不是warn而是弹出一个对话框。
改变运行代码
通常不需要这样做 (只需要退出应用程序,如上设置环境变量然后再运行它即可)。 这样做很 危险 (比如将你的硬盘数据变成垃圾并当掉你的系统)。所以 除非你觉得这样做很爽,否则不要这样做。 我已经警告你了!
将内存中的中断代码(它可以使你进入调试器)改变成为一条NOP(空操作)指令是可能的。
你在调试器中运行程序知道你遇到一个断言,可以看到一些汇编代码,其中一条汇编代码指令是"int 3"。 查看那行的内存地址,现在打开内存查看窗口,键入/复制/拖动 "int 3"指令的内存地址到内存查看窗口中 从而可以改变那部分内存的值。改变内存值为"90",关闭内存查看窗口,点击 "F5"继续。
有点糊涂?看下面的屏幕截图:
VC++ 7.0?
调试优化后的连接文件
为了能有效的调试优化后的连接文件,应该启用profiling,它可以有效地将调试符号遗留到优化后 的代码中,这样你仍然可以设置断点等等。由于代码被优化,单步执行代码可能有时会在调试器跳过的地方给你带来惊奇。
必须确定环境变量被设置如下:
set MOZ_PROFILE=1
同时运行两个Mozilla实例
可以同时运行两个Mozilla例程 (比如 调试和优化),只需要设置环境变量MOZ_NO_REMOTE:
set MOZ_NO_REMOTE=1
调试JavaScript
使用Venkman,Mozilla的JavaScript 调试器。
没有答案的问题和有答案的新问题
有一些问题我现在还不知到答案,如果你知道的话请给我写信。
如果你觉得自己知道调试Mozilla的一个很 cool的技巧,请告诉我,我会把它包含到这里