Mozilla中国中心

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通知我。

  1. 基本要求
  2. 开启调试器的方法
  3. 为Mozilla创建一个Visual C++工程
  4. 改变可执行文件到调试状态
  5. 命令行参数
  6. 为还未载入内存的动态连接库设置断点
  7. 显示Unicode 字符串
  8. 定制调试器的变量值显示窗口
  9. 禁用断言
  10. 调试优化后的连接文件
  11. 同时运行两个Mozilla实例
  12. 调试JavaScript
  13. 没有答案的问题和有答案的新问题

基本需求

参考 build instructions.

开启调试器的方法

启动 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"继续。

有点糊涂?看下面的屏幕截图:

Screenshot of disabling assertions

VC++ 7.0?

调试优化后的连接文件

为了能有效的调试优化后的连接文件,应该启用profiling,它可以有效地将调试符号遗留到优化后 的代码中,这样你仍然可以设置断点等等。由于代码被优化,单步执行代码可能有时会在调试器跳过的地方给你带来惊奇。

必须确定环境变量被设置如下:

set MOZ_PROFILE=1

同时运行两个Mozilla实例

可以同时运行两个Mozilla例程 (比如 调试和优化),只需要设置环境变量MOZ_NO_REMOTE:

set MOZ_NO_REMOTE=1

调试JavaScript

使用Venkman,Mozilla的JavaScript 调试器。

没有答案的问题和有答案的新问题

有一些问题我现在还不知到答案,如果你知道的话请给我写信。

如果你觉得自己知道调试Mozilla的一个很 cool的技巧,请告诉我,我会把它包含到这里

 Mozilla中国中心