【问题标题】:What does ovly_debug_event do in chrome?ovly_debug_event 在 chrome 中做了什么?
【发布时间】:2012-11-02 16:33:16
【问题描述】:

我在查看 chrome 的线程堆栈时发现很多线程都有类似这样的踪迹:

0, wow64cpu.dll!TurboDispatchJumpAddressEnd+0x6c0
1, wow64cpu.dll!TurboDispatchJumpAddressEnd+0x4a8
2, wow64.dll!Wow64SystemServiceEx+0x1ce
3, wow64.dll!Wow64LdrpInitialize+0x429
4, ntdll.dll!RtlIsDosDeviceName_U+0x24c87
5, ntdll.dll!LdrInitializeThunk+0xe
6, ntdll.dll!ZwWaitForSingleObject+0x15
7, kernel32.dll!WaitForSingleObjectEx+0x43
8, kernel32.dll!WaitForSingleObject+0x12
9, chrome.dll!ovly_debug_event+0x16574
10, chrome.dll!ovly_debug_event+0x14904
11, chrome.dll!ovly_debug_event+0x14826
12, chrome.dll!ovly_debug_event+0x16d19
13, chrome.dll!ovly_debug_event+0x1bea1b
14, chrome.dll!ovly_debug_event+0xe8ff4
15, chrome.dll!ovly_debug_event+0x16b50
16, chrome.dll!ovly_debug_event+0x16ab2
17, kernel32.dll!BaseThreadInitThunk+0x12
18, ntdll.dll!RtlInitializeExceptionChain+0x63
19, ntdll.dll!RtlInitializeExceptionChain+0x36

铬源在sel_ldr.c 中有以下代码,似乎将ovly_debug_event 声明为一个几乎为空的函数:

void _ovly_debug_event (void) {
#ifdef __GNUC__
  /*
   * The asm volatile is here as instructed by the GCC docs.
   * It's not enough to declare a function noinline.
   * GCC will still look inside the function to see if it's worth calling.
   */
  __asm__ volatile ("");
#elif NACL_WINDOWS
  /*
   * Visual Studio inlines empty functions even with noinline attribute,
   * so we need a compile memory barrier to make this function not to be
   * inlined. Also, it guarantees that nacl_global_xlate_base initialization
   * is not reordered. This is important for gdb since it sets breakpoint on
   * this function and reads nacl_global_xlate_base value.
   */
  _ReadWriteBarrier();
#endif
}

static void StopForDebuggerInit (uintptr_t mem_start) {
  /* Put xlate_base in a place where gdb can find it.  */
  nacl_global_xlate_base = mem_start;

  NaClSandboxMemoryStartForValgrind(mem_start);

  _ovly_debug_event();
}

这就提出了一个问题:为什么 chrome 似乎在一个只用于调试而在 chromium 中几乎是空的函数上花费了这么多时间?

【问题讨论】:

    标签: c++ c google-chrome stack-trace chromium


    【解决方案1】:

    此外,该函数实际上是 GDB 的辅助函数,用于帮助调试覆盖。见https://sourceware.org/gdb/onlinedocs/gdb/Automatic-Overlay-Debugging.html

    【讨论】:

      【解决方案2】:

      注意这个函数的大量偏移,例如 0x16574。看来您没有 chrome.dll 的私有符号,因此调试器正在寻找最接近(嗯,最接近的先前)公开导出的符号。

      换句话说,你不在 _ovly_debug_event 中。您所在的函数在可执行文件中排在它之后,但并未公开导出。

      要尝试解决此问题,如果您想查看实际发生的情况,可以添加 http://chromium-browser-symsrv.commondatastorage.googleapis.com 到您的符号路径。在windbg中,命令是

      .sympath+ SRV*C:\tmp*http://chromium-browser-symsrv.commondatastorage.googleapis.com

      【讨论】:

        猜你喜欢
        • 2015-06-29
        • 1970-01-01
        • 2014-08-03
        • 2012-02-12
        • 2010-10-26
        • 2019-07-12
        • 2010-11-20
        • 2011-07-24
        • 2012-08-07
        相关资源
        最近更新 更多