您的位置:首页 > 编程语言

chrome代码总结 --- 发文于2013-12-11

2016-01-15 22:43 267 查看
一. 启动:
  1.WinMain:在chrome exe工程的chrome_exe_main.cc中,
     MainDllLoader* loader = MakeMainDllLoader(); 
     int rc = loader->Launch(instance, &sandbox_info);主要是加载chrome.dll文件.
  MainDllLoader::Launch的实现在client_util.cc中,动态获取chrome.dll中的入口函数“ChromeMain”的地址然后调用进入.
  2. ChromeMain的实现在chrome_main.cc->content_main.cc->content_main_runner.cc中(src\content\app\content_main_runner.cc):
 if (process_type == switches::kRendererProcess) {
    rv = RendererMain(main_params);
  } else if (process_type == switches::kExtensionProcess) {
    // An extension process is just a renderer process. We use a different
    // command line argument to differentiate crash reports.扩展进程入口
    rv = RendererMain(main_params);
  } else if (process_type == switches::kPluginProcess) {
    rv = PluginMain(main_params);
  } else if (process_type == switches::kUtilityProcess) {
    rv = UtilityMain(main_params);
  } else if (process_type.empty()) {
    ScopedOleInitializer ole_initializer;
    rv = BrowserMain(main_params); //主进程,启动进这里
  } else 
  3.Browser主进程入口在browser_main.cc中,
   BrowserInit位置http://src.chromium.org/svn/branches/official/build_164.0/src/chrome/browser/browser_init.h
   a.生成UI类型的消息循环对象main_message_loop
   b.生成browser进程对象browser_process,并初始化(启动)文件、数据库、io等辅助线程。
   c.调用BrowserInit::ProcessCommandLine->BrowserInit::LaunchBrowserImpl->BrowserInit::Launch->{
      if (!OpenApplicationURL(profile)) {  
   
   std::vector<GURL> urls_to_open = GetURLsFromCommandLine(profile_); 
if (!OpenStartupURLs(process_startup, urls_to_open)) {  
        
     OpenURLsInBrowser(browser, process_startup, urls_to_open)->Browser::AddTabWithURL,browser-> window ()->Show ();
 
}
      }
      启动浏览器主UI界面,该句执行后,浏览器窗口就显示出来了。
   d.调用RunUIMessageLoop进入浏览器UI主线程消息循环,后续工作完全基于消息驱动。
   
   在c步中,浏览器窗口启动过程,在/chrome/browser/ui/browser_init.cc中,
   browser_init.cc文件中的BrowserInit::LaunchWithProfile::OpenURLsInBrowser(),整理如下:
   该函数会创建一个Browser对象,每一个浏览器窗口都对应一个Browser对象。然后调用browser对象的AddTabWithURL
   方法来打开相应的URL,我们的主页地址也将在AddTabWithURL中被打开。最后调用browser->window()->Show(),
   显示浏览器UI窗口,对应的url页面也将被显示。
   e.在OpenURLsInBrowser中,
       TabContents* contents =
      CreateTabContentsForURL(url_to_load, referrer, profile_, transition,
                              false, instance);
      tabstrip_model_.AddTabContents(contents, -1, transition, foreground);
       在CreateTabContentsForURL中
 
TabContents* contents = TabContents::CreateWithType(type, profile, instance);
           contents->SetupController(profile);
      if (!defer_load) {
     
// Load the initial URL before adding the new tab contents to the tab strip
    
// so that the tab contents has navigation state.
    
contents->controller()->LoadURL(url, referrer, transition);
      }
    f.TabContents(表示一个标签)直接和render交互,http://www.douban.com/note/32671779/
     在LoadURL(navigation_controller.cc)中
NavigationEntry* entry = CreateNavigationEntry(url, referrer, transition);   //entry是当前tab的导航历史
LoadEntry(entry);
     在LoadEntry中
DiscardNonCommittedEntriesInternal();
  
pending_entry_ = entry;
  
NotificationService::current()->Notify(
        
NotificationType::NAV_ENTRY_PENDING,
        
Source<NavigationController>(this),
       
NotificationService::NoDetails()
 
);
  
NavigateToPendingEntry(false);
    g.在WebContents中实现了NavigateToPendingEntry函数,后面新建render Host进程,见http://blog.csdn.net/zero_lee/article/details/7870243
    h.delegate_::CreateRenderViewForRenderManager或者说是WebContents类的这个函数(因为WebContents是一种RenderViewHostManager::delegate)会调用RenderViewHost::CreateRenderView函数,创建一个Render进程,如果还不存在的话。
  4.Renderer进程启动:
    作为多进程架构,所谓Renderer进程就是内核的渲染进程,每个页面的显示都有Renderer进程中相应的内核对象与之对应。
Renderer进程主要包含了Webkit和V8两大内核对象。
Renderer进程的启动过程是随着URL的打开而启动,即browser->AddTabWithURL调用会触发Renderer进程的启动,具体在browser_render_process_host.cc中的Init方法.
browser_render_process_host.cc文件是理解体系结构很重要的一个文件,其中的Init方法是关键。可以在该方法中
设置断点,通过查看调用栈可以了解详细的调用路径。在Init中,先构造一个资源消息过滤器(ResourceMessageFilter)
然后构造和Renderer进程通信的IPC通道,并将资源消息过滤器安装在该通道上。最后通过构造一个ChildProcessLauncher
对象来启动Renderer进程,注意ChildProcessLauncher构造函数传递了执行文件路径,命令行等参数。
这里的关键是ChromeThread::PostTask()的调用。该函数是chrome中线程调度体系的一个重要助手函数。当一个线程需要向另外一个线程投递一个任务时(在另外一个线程上运行指定的代码)调用该函数很方便,第一个参数是目标线程的标识符(chrome的每种线程都有对应的标识符,通过标识符就可以获取到线程对象)。第三个参数是需要在目标线程上运行的代码。chrome提供了很多灵活的模板方法(可以参考base项目中的task.h实现)来构造第三个参数,第三个参数即可以是一个独立的函数入口,又可以是某个类对象的公有方法,且该方法可以有任意的参数数目和数据类型。
在这里,主UI线程把启动Render进程的任务投递给独立的“进程启动者线程”(PROCESS_LAUNCHER)来完成,具体的代码是调用Context::LaunchInternal()方法:
  5.Render进程入口:
  在Renderer工程的render_view.cc这个关键文件中设定断点来查看调用栈。注意:为了及早跟踪必须尽早附加到启动后的Render进程,所以最早的时机是执行了上面LaunchInternal函数中的语句handle = sandbox::StartProcessWithAccess(cmd_line, exposed_dir); 该语句执行后Render进程就生成了,此时通过vs2008 ”Tools“菜单中的“Attach
to Process”来附加到Render进程(chrome.exe)。
通过调用栈可以看到该函数的调用路径,从调用路径中可以看出该初始化过程是由一个IPC消息触发,消息通过IPC通道最终被分派到void ChildThread::OnMessageReceived(…),通过消息映射,该消息ViewMsg_New由相应的函数来处理,并最终调用到RenderView::Init完成内核初始化。在RenderView::Init中,webview()->initializeMainFrame(this)此句完成了webkit内核的初始化。
以后的过程就是主进程和Renderer进程通过IPC通道进行消息交互的协作过程。
ViewMsg_New消息是浏览器主进程在打开新页面的时候发送给Renderer进程的控制消息,其目的是打开一个对应的RenderView对象完成内核初始化,在主进程中与之对应的通信对象是RenderViewHost。
   6.打开url堆栈,部分解析过程http://blog.csdn.net/dlmu2001/article/details/6164873
bu DocumentLoader::startLoadingMainResource
4:006> bl
 0 e 01cd2758     0001 (0001)  4:**** chrome_child!WebCore::HTMLFrameElementBase::openURL
 1 e 0199c8da     0001 (0001)  4:**** chrome_child!WebKit::WebFrameImpl::create
 2 e 020a5b98     0001 (0001)  4:**** chrome_child!WebCore::EmptyFrameLoaderClient::createDocumentLoader
 3 e 0199cb6d     0001 (0001)  4:**** chrome_child!WebCore::Frame::create
 4 e 02b577e9     0001 (0001)  4:**** chrome_child!ViewHostMsg_OpenURL_Params::ViewHostMsg_OpenURL_Params
Breakpoint 1 hit
eax=0026f20c ebx=017a7b00 ecx=01723900 edx=03036be0 esi=016ebc00 edi=01723900
eip=0199c8da esp=0026f1f0 ebp=0026f204 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
chrome_child!WebKit::WebFrameImpl::create:
0199c8da 55              push    ebp
4:006> kv 100
ChildEBP RetAddr  Args to Child              
0026f1ec 0199c8a5 0026f20c 017a7168 03039160 chrome_child!WebKit::WebFrameImpl::create (FPO: [Non-Fpo]) (CONV: cdecl) [c:\b\build\slave\win\build\src\third_party\webkit\source\web\webframeimpl.cpp @ 2065]
0026f204 0198bd25 017a7168 00000001 01724734 chrome_child!WebKit::WebViewImpl::initializeMainFrame+0x13 (FPO: [Non-Fpo]) (CONV: thiscall) [c:\b\build\slave\win\build\src\third_party\webkit\source\web\webviewimpl.cpp @ 321]
0026f250 0198a799 0026f260 016c2b00 fffffffe chrome_child!content::RenderViewImpl::Initialize+0x290 (FPO: [Non-Fpo]) (CONV: thiscall) [c:\b\build\slave\win\build\src\content\renderer\render_view_impl.cc @ 909]
0026f29c 0198a713 fffffffe 0026f2fc 0026f3b4 chrome_child!content::RenderViewImpl::Create+0x7f (FPO: [Non-Fpo]) (CONV: cdecl) [c:\b\build\slave\win\build\src\content\renderer\render_view_impl.cc @ 1083]
0026f2e4 01988cd4 0026f2fc 01724734 016c2b04 chrome_child!content::RenderThreadImpl::OnCreateNewView+0x70 (FPO: [Non-Fpo]) (CONV: thiscall) [c:\b\build\slave\win\build\src\content\renderer\render_thread_impl.cc @ 1126]
0026f5b0 0192d0c3 01724734 016c2b00 016c2b00 chrome_child!ViewMsg_New::Dispatch<content::RenderThreadImpl,content::RenderThreadImpl,void (__thiscall content::RenderThreadImpl::*)(ViewMsg_New_Params const &)>+0x4a (FPO: [Non-Fpo])
(CONV: cdecl) [c:\b\build\slave\win\build\src\content\common\view_messages.h @ 814]
0026f650 018e69d6 01724734 016e8e10 034d39ff chrome_child!content::RenderThreadImpl::OnControlMessageReceived+0x21f (FPO: [Non-Fpo]) (CONV: thiscall) [c:\b\build\slave\win\build\src\content\renderer\render_thread_impl.cc
@ 1097]
0026f6bc 018e682c 01724734 0026f798 016c0c98 chrome_child!content::ChildThread::OnMessageReceived+0x196 (FPO: [Non-Fpo]) (CONV: thiscall) [c:\b\build\slave\win\build\src\content\child\child_thread.cc @ 350]
0026f6ec 018e6796 01724734 016c0c98 0026f770 chrome_child!IPC::ChannelProxy::Context::OnDispatchMessage+0x93 (FPO: [Non-Fpo]) (CONV: thiscall) [c:\b\build\slave\win\build\src\ipc\ipc_channel_proxy.cc @ 270]
0026f6fc 018e5acf 01724720 0026fb24 01724724 chrome_child!base::internal::Invoker<2,base::internal::BindState<base::internal::RunnableAdapter<void (__thiscall content::P2PHostAddressRequest::*)(std::vector<unsigned char,std::allocator<unsigned
char> > const &)>,void __cdecl(content::P2PHostAddressRequest *,std::vector<unsigned char,std::allocator<unsigned char> > const &),void __cdecl(content::P2PHostAddressRequest *,std::vector<unsigned char,std::allocator<unsigned char> >)>,void __cdecl(content::P2PHostAddressRequest
*,std::vector<unsigned char,std::allocator<unsigned char> > const &)>::Run+0x16 (FPO: [Non-Fpo]) (CONV: cdecl) [c:\b\build\slave\win\build\src\base\bind_internal.h @ 1253]
0026f770 018e580a 0026fb24 0026f798 016cf480 chrome_child!base::MessageLoop::RunTask+0x223 (FPO: [Non-Fpo]) (CONV: thiscall) [c:\b\build\slave\win\build\src\base\message_loop\message_loop.cc @ 493]
0026f8c0 018e8761 0026fb24 0026f92c 00000000 chrome_child!base::MessageLoop::DoWork+0x301 (FPO: [Non-Fpo]) (CONV: thiscall) [c:\b\build\slave\win\build\src\base\message_loop\message_loop.cc @ 618]
0026f8e4 01900782 0026f910 018e5455 0026fb24 chrome_child!base::MessagePumpDefault::Run+0xca (FPO: [Non-Fpo]) (CONV: thiscall) [c:\b\build\slave\win\build\src\base\message_loop\message_pump_default.cc @ 33]
0026f948 019000b5 016d0d50 00000005 00000000 chrome_child!base::debug::TraceLog::AddTraceEventEtw+0x28 (FPO: [Non-Fpo]) (CONV: cdecl) [c:\b\build\slave\win\build\src\base\debug\trace_event_impl.cc @ 1627]
0026fc60 018dce7f 0026fc94 016d0d20 00000000 chrome_child!content::RendererMain+0x398 (FPO: [Non-Fpo]) (CONV: cdecl) [c:\b\build\slave\win\build\src\content\renderer\renderer_main.cc @ 253]
0026fc74 018dcde3 0026fca4 0026fc94 0026fd08 chrome_child!content::RunNamedProcessTypeMain+0x7b (FPO: [Non-Fpo]) (CONV: cdecl) [c:\b\build\slave\win\build\src\content\app\content_main_runner.cc @ 458]
0026fce0 018cb04f 010f1c80 010f5a88 0026fd28 chrome_child!content::ContentMainRunnerImpl::Run+0x85 (FPO: [Non-Fpo]) (CONV: thiscall) [c:\b\build\slave\win\build\src\content\app\content_main_runner.cc @ 777]
0026fcf0 018caa94 011e0000 0026fdb8 0026fd08 chrome_child!content::ContentMain+0x29 (FPO: [Non-Fpo]) (CONV: cdecl) [c:\b\build\slave\win\build\src\content\app\content_main.cc @ 35]
0026fd28 01208907 011e0000 0026fdb8 0026fdc0 chrome_child!ChromeMain+0x2b (FPO: [Non-Fpo]) (CONV: cdecl) [c:\b\build\slave\win\build\src\chrome\app\chrome_main.cc @ 34]
0026fda0 0120ae38 011e0000 0026fdb8 00000000 chrome!MainDllLoader::Launch+0xf5 (FPO: [Non-Fpo]) (CONV: thiscall) [c:\b\build\slave\win\build\src\chrome\app\client_util.cc @ 298]
0026fdc4 0120aeb5 011e0000 00000000 007837a8 chrome!`anonymous namespace'::RunChrome+0x5e (FPO: [Non-Fpo]) (CONV: cdecl) [c:\b\build\slave\win\build\src\chrome\app\chrome_exe_main_win.cc @ 49]
0026fe0c 01229ef3 011e0000 00000000 00771e9c chrome!wWinMain+0x62 (FPO: [Non-Fpo]) (CONV: stdcall) [c:\b\build\slave\win\build\src\chrome\app\chrome_exe_main_win.cc @ 115]
0026fe9c 76c6ed5c 7ffdc000 0026fee8 76e137eb chrome!__tmainCRTStartup+0x11a (FPO: [Non-Fpo]) (CONV: cdecl) [f:\dd\vctools\crt_bld\self_x86\crt\src\crt0.c @ 275]
0026fea8 76e137eb 7ffdc000 76998269 00000000 kernel32!BaseThreadInitThunk+0xe (FPO: [Non-Fpo])
0026fee8 76e137be 01229f46 7ffdc000 ffffffff ntdll!__RtlUserThreadStart+0x70 (FPO: [Non-Fpo])
0026ff00 00000000 01229f46 7ffdc000 00000000 ntdll!_RtlUserThreadStart+0x1b (FPO: [Non-Fpo])
   7.其中 WebFrameImpl是webframe的实现类,WebFrameImpl架起了chromium的render process和webkit的桥梁,感兴趣的可以阅读源码接口;关于FrameLoader,见http://blog.csdn.net/shunzi__1984/article/details/6262526
      http://www.cnblogs.com/xyz2abc/archive/2012/05/08/2489895.html
      在FrameLoader的load函数中主要做了以下事情:
a、初始化相应的Request,比如FrameLoadRequest和ResourceRequest;以及相应的FrameLoadType;
b、调用loadWithNavigationAction函数--->
loadWithNavigationAction函数的功能:
a、通过m_client(FrameLoadClientImpl)的createDocumentLoader函数得到一个DocumentLoader,实际上是DocumentLoader的后代WebDataSourceImpl,它重写了部分DocumentLoader的接口功能,这样就把webkit的网络加载请求可以转化为对chromium的请求,我个人的猜测,具体要看了代码才知道
b、设置第一步得到的DocumentLoader的一些属性,并把该Loader赋给m_policyDocumentLoader,并做了相关的清除工作,见FrameLoader的setPolicyDocumentLoader函数
c、呼叫checkNavigationPolicyAndContinueLoad函数--->
checkNavigationPolicyAndContinueLoad的功能:
a、通过一系列的检查,看能否继续进行加载
b、如果能加载就呼叫setProvisionalDocumentLoader,把m_policyDocumentLoader赋给m_provisionalDocumentLoader,进入到FrameStateProvisional状态
c、呼叫prepareForLoadStart,在这个函数里呼叫RenderViewImpl的dispatchDidStartProvisionalLoad函数,一直到WebContentImpl的DidStartProvisionalLoadForFrame函数
d、加载前的相关准备工作,呼叫m_provisionalDocumentLoader->startLoadingMainResource开始加载,这里呼叫的是DocumentLoader的startLoadingMainResource函数,虽然是通过WebDataSourceImpl的对象进行呼叫的--->
DocumentLoader::startLoadingMainResource,正式开始加载(在src\third_party\WebKit\Source\core\loader\DocumentLoader.cpp中)
a、呼叫willSendRequest函数,处理redirection等情况,处理空网页情况
b、发送请求前的准备工作
c、调用CachedResourceLoader的requestMainResource函数,发送加载网页ResourceRequest请求给浏览器(browser);
   ResourceRequest请求是一个类,格式在src\third_party\WebKit\Source\core\platform\network\ResourceRequst.h中,包括对html头的设置方法,Kurl,请求显示类型。其中,kurl在src\third_party\WebKit\Source\weborigin\krul.h定义,
   包含url字串。

二.加载及解析,渲染URL过程.
1.LoadUrl回调用到FrameLoader的load,在FrameLoader::load中会创建DocumentLoader,DocumentLoader会被FrameLoader维护。
DocumentLoader中有成员mutable DocumentWriter m_writer.
DocumentWriter该类位于WebCore/loader目录下.DocumentWriter相当于 loader与parser的桥梁。这里先看下loader与parser之间的关联的流程。进一步的调用后会调用到DocumentLoader::commitData。
在DocumentLoader::commitData中执行了二个使用DocumentWriter的操作。
a.对DocumentWriter设置编码,DocumentWriter::setEncoding
b.把收到的数据转交给DocumentWriter,DocumentWriter::addData。
结束接收数据时调用了DocumentWriter::end函数。
2.与dom关联的起源
在src\third_party\WebKit\Source\core\loader\DocumentWriter.cpp中.
DocumentWriter::setEncoding.该函数会通过成员Frame找到FrameLoader,然后调用FrameLoader::willSetEcoding。这个函数会进一步调用FrameLoader::receivedFirstData.
调用了DocumentWriter::begin之后,该函数会会通过DocumentWriter::createDocument创建一个Document。
3.开始dom
Document在src\third_party\WebKit\Source\core\dom\Document.pp中,创建Document的函数是DOMImplementation::createDocument.它会根据参数传入的MimeType来创建具体的Document子类。这些具体的子类绝大多数都是在WebCore/html目录下定义的.
在DocumentWrite::begin中,创建完Document后,会把这个Document设置给DocumentWrite的成员Frame中。通过函数Frame::setDocument,然后调用调用了Document::attach。Node与RenderObject关联和接关联就是通过attach和detach函数。
Document的另一个祖先类ContainerNode,该类也实现了attach虚函数,ContainerNode:: attach的实现就是调用其每个子Node的attach,最后调用其基类的Node::attach。因为ContainerNode是个容器,所以ContainerNode有一堆子Node,因为有子Node,所以子Node也要调用attach。Document是个特殊的Node,它是整个DOM树的根,所以它对应的RenderObject也要特殊,他对应的是RenderView,他是Render树的根。Document::attach中创建了RenderView,并把它设置给Document,主要工作就是
创建并设置RenderView。数据都是从ResourceLoader(MainResourceLoader)中传到DocumentLoader 再进一步传到DocumentWriter,最后传给Document 的。
4.创建dom解析器。
执行了FrameLoader::didBeginDocument之后,会调用Document::implicitOpen,该函数中创建parser.
HTMLDocumentParser在WebCore/html/parser/目录下,构造函数中HTMLTokenizer,HTMLTreeBuilder都会被创建。
到现在ResourceLoader(MainResourceLoader)->传递回调->DocumentLoader->构造时一并创建->DocumentWriter->setEncoding-> begin->创建HTMLDocument(与RenderView)-> implicitOpen->创建HTMLDocumentParser。
setEncoding只有在第一次接收到数据时才会调用begin后面的操作,每次接收数据setEncoding都会被调用,但是后续的数据接收并不会每次都创建一遍HTMLDocument了。
5.开始即完成解析.
进入DocumentParser的解析,DocumentWriter::addData,把参数传进来的数据转交给DocumentParser::appendBytes。完成解析时,
DocumentWriter::end先执行一个DocumentParser::appendBytes(0, 0, true)这个true表示flush。即通知解析器把Buffer存的数据都解析完。
6.具体词法及句法解码过程。
http://blog.csdn.net/hxwwf/article/details/7429746
7.渲染过程
http://blog.csdn.net/hxwwf/article/details/7646359
8.extension扩展进程
 chrome在启动或者安装扩展时,调用src\src\base\json\JSONFileValueSerializer.cc解析manifest.json文件,解析完后循环等待接收tab发来的消息。
 当前tab可以在document_start,document_end或者document_idle时候加载当前的extension的content js脚本内容。

9.npapi插件进程
  在src\content\plugin\plugin_main.cc中,PluginMain函数在插件进程被启动时调用,判断是否是有窗口的插件,新建PluginThread线程,调用PatchNPNFunctions函数
。然后加载插件dll文件,调用插件的NP_Initialize函数。然后进入消息循环接收task调用,堆栈如下:
>
sample.dll!CSample::HasMethod(void * name=0x03f5c9e0)  Line 78
C++
 
sample.dll!CSample::_HasMethod(NPObject * npobj=0x05d51404, void * name=0x03f5c9e0)  Line 33 + 0x43 bytes
C++
 
chrome_child.dll!content::NPObjectStub::OnHasMethod(const content::NPIdentifier_Param & name={...}, bool * result=0x0028ef38)  Line 127 + 0xa bytes
C++
 
chrome_child.dll!IPC::SyncMessageSchema<Tuple1<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,Tuple1<bool &> >::DispatchWithSendParams<ppapi::proxy::PluginDispatcher,ppapi::proxy::PluginDispatcher,void (__thiscall ppapi::proxy::PluginDispatcher::*)(std::basic_string<char,std::char_traits<char>,std::allocator<char>
> const &,bool *)>(bool ok=true, const Tuple1<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > & send_params={...}, const IPC::Message * msg=0x03f5ca40, ppapi::proxy::PluginDispatcher * obj=0x03f31ea0, ppapi::proxy::PluginDispatcher *
sender=0x03f31ea0, void (const std::basic_string<char,std::char_traits<char>,std::allocator<char> > &, bool *)* func=0x03067d24)  Line 822
C++
 
chrome_child.dll!NPObjectMsg_RemoveProperty::Dispatch<content::NPObjectStub,content::NPObjectStub,void (__thiscall content::NPObjectStub::*)(content::NPIdentifier_Param const &,bool *)>(const IPC::Message * msg=0x03f5ca40, content::NPObjectStub * obj=0x03f31ea0,
content::NPObjectStub * sender=0x03f31ea0, void (const content::NPIdentifier_Param &, bool *)* func=0x03067d24)  Line 359 + 0x38 bytes
C++
 
chrome_child.dll!content::NPObjectStub::OnMessageReceived(const IPC::Message & msg={...})  Line 93 + 0x37 bytes
C++
 
chrome_child.dll!content::MessageRouter::RouteMessage(const IPC::Message & msg={...})  Line 50
C++
 
chrome_child.dll!content::NPChannelBase::OnMessageReceived(const IPC::Message & message={...})  Line 182 + 0xb bytes
C++
 
chrome_child.dll!content::PluginChannel::OnMessageReceived(const IPC::Message & msg={...})  Line 189 + 0x9 bytes
C++
 
chrome_child.dll!IPC::ChannelProxy::Context::OnDispatchMessage(const IPC::Message & message={...})  Line 270
C++
 
chrome_child.dll!IPC::SyncChannel::ReceivedSyncMsgQueue::DispatchMessages(IPC::SyncChannel::SyncContext * dispatching_context=0x03f56e10)  Line 126
C++
 
chrome_child.dll!IPC::SyncChannel::SyncContext::DispatchMessages()  Line 298
C++
 
chrome_child.dll!IPC::SyncChannel::ReceivedSyncMsgQueue::DispatchMessagesTask(IPC::SyncChannel::SyncContext * context=0x03f56e10)  Line 93 + 0x8 bytes
C++
 
chrome_child.dll!base::internal::Invoker<2,base::internal::BindState<base::internal::RunnableAdapter<void (__thiscall `anonymous namespace'::HeapStatisticsCollector::*)(int)>,void __cdecl(`anonymous namespace'::HeapStatisticsCollector *,int),void __cdecl(base::internal::UnretainedWrapper<`anonymous
namespace'::HeapStatisticsCollector>,int)>,void __cdecl(`anonymous namespace'::HeapStatisticsCollector *,int)>::Run(base::internal::BindStateBase * base=0x03f5cf40)  Line 1254
C++
 
chrome_child.dll!base::MessageLoop::RunTask(const base::PendingTask & pending_task={...})  Line 493
C++
 
chrome_child.dll!base::MessageLoop::DoWork()  Line 618
C++
 
chrome_child.dll!base::MessagePumpForUI::DoRunLoop()  Line 243 + 0x9 bytes
C++
 
chrome_child.dll!base::MessagePumpWin::Run(base::MessagePump::Delegate * delegate=0x0028f494)  Line 48 + 0x3e bytes
C++
 
chrome_child.dll!base::MessageLoop::RunInternal()  Line 442
C++
 
chrome_child.dll!base::MessageLoop::RunInternalInSEHFrame()  Line 420 + 0x8 bytes
C++
 
chrome_child.dll!base::RunLoop::Run()  Line 47 + 0x11 bytes
C++
 
chrome_child.dll!base::MessageLoop::Run()  Line 312
C++
 
chrome_child.dll!content::PluginMain(const content::MainFunctionParams & parameters={...})  Line 82
C++
 
chrome_child.dll!content::RunNamedProcessTypeMain(const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & process_type="plugin", const content::MainFunctionParams & main_function_params={...}, content::ContentMainDelegate * delegate=0x0028f670)
 Line 458 + 0xa bytes
C++
 
chrome_child.dll!content::ContentMainRunnerImpl::Run()  Line 777 + 0x1c bytes
C++
 
chrome_child.dll!content::ContentMain(HINSTANCE__ * instance=0x00910000, sandbox::SandboxInterfaceInfo * sandbox_info=0x0028f720, content::ContentMainDelegate * delegate=0x0028f670)  Line 35 + 0x3 bytes
C++
 
chrome_child.dll!ChromeMain(HINSTANCE__ * instance=0x00910000, sandbox::SandboxInterfaceInfo * sandbox_info=0x0028f720)  Line 34
C++
 
chrome.exe!MainDllLoader::Launch(HINSTANCE__ * instance=0x00910000, sandbox::SandboxInterfaceInfo * sbox_info=0x0028f720)  Line 298
C++
 
chrome.exe!`anonymous namespace'::RunChrome(HINSTANCE__ * instance=0x00910000)  Line 49
C++
 
chrome.exe!wWinMain(HINSTANCE__ * instance=0x00910000, HINSTANCE__ * prev=0x00000000, wchar_t * __formal=0x00481e4c, wchar_t * __formal=0x00481e4c)  Line 115 + 0x8 bytes
C++
 
chrome.exe!__tmainCRTStartup()  Line 275 + 0x1c bytes
C
 
kernel32.dll!@BaseThreadInitThunk@12()  + 0x12 bytes

 
ntdll.dll!___RtlUserThreadStart@8()  + 0x27 bytes

 
ntdll.dll!__RtlUserThreadStart@8()  + 0x1b bytes

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  chrome 源码 分析