firefox调试记录3——其他情况的跟踪

其他情况主要包括:
环境设置不做变动,保持默认值。
设置为启动firefox时打开空白页/打开主页等

环境设置保持默认值

直接按F10,开始调试。这一次没有打开profilemanager,而是直接使用了电脑上的默认profile。打开了主页。跟踪依据最开始的跟踪方式,在确定需要跟进的地方按F11,其他地方按F10,不过,在~\firefox-8.0.source\toolkit\xre\nsAppRunner.cpp文件里的XRE_main函数中没有发生预期的效果,也就是没有打开profilemanager的过程。因此在XRE_main函数处设置断点,进行第二遍跟踪。
第二遍仔细跟踪XRE_main函数发现在如下图的地方,打开了firefox:

而前面的选择profile的SelectProfile函数的调用在该函数后大约50行左右的地方。设置了环境MOZ_NO_REMOTE=1时也执行了这句话的,但并没有在这里打开firefox而是接着执行了后面的一部分代码之后打开了profilemanager。这里我跟进这个nativeApp->Start(&canRun);

注意,注释说在检查是否已经有一个firefox在运行,有的话使用这个操作(start)来通知窗口发送一个与该进程命令行选项相关的请求。如果没有firefox在运行,则创建这个消息窗口。我在调试跟踪的时候确实有一个firefox在运行,所以这里就发送了一个请求,在下图所示的地方:

这个请求发送过后,就打开了一个firefox窗口。之后该函数返回,其返回值rv使得nativeApp->Start(&canRun);后面的if条件满足,因此就直接依次返回。
这样看来,我要将我在运行的那个firefox关闭之后再进行这次跟踪。关闭之后,发现也是运行到rv = msgWindow.SendRequest();的时候打开firefox。唯一不同的是这次打开的是关闭前的网页,因为我的default profile的设置就是这样。由于前一次有firefox在运行,打开的时候打开了主页。因此跟踪一下这个SendRequest()函数,到了下图所示的地方:

这里的两个函数都是windows API函数,先将窗口置于最前端,然后发送消息。查看一下MSDN,sendmessage的第二个参数为发送的消息,第一个参数为目标窗口句柄。最后一个参数为(LPARAM) lParam // data (PCOPYDATASTRUCT),可能是WM_COPYDATA的数据吧!该函数执行之后,firefox就打开了,打开的是主页。现在需要搞清楚在哪个地方创建的mHandle这个句柄。一直往前发现在~\firefox-8.0.source\xpcom\glue\standalone\nsXPCOMGlue.cpp文件中加载xul.dll的时候创建了新线程。这个线程在打开firefox过程中一直存在,说明很可能是在这个进程中创建的mHandle窗口句柄。涉及到另外的进程了,到后面研究,下面看看环境依然设置为MOZ_NO_REMOTE=1的时候,让其打开空白页看看是怎样进行的。

打开空白页

将前面打开的firefox的选项设置为启动firefox的时候打开空白页。下面是跟踪过程,如果与第一遍一样的话就不记录了。
没有什么特别的,只要是设置了moz-no-remote=1的都是先打开profilemanager然后调用CreateProcess创建新的进程运行firefox。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值