6

多くのスレッドに次のようなトレースがあることに気付いたとき、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 は、デバッグ専用で chrome ではほとんど空の関数に多くの時間を費やしているように見えるのでしょうか?

4

2 に答える 2

4

この関数への 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

于 2013-04-30T14:02:12.713 に答える
1

さらに、その関数は、実際にはオーバーレイのデバッグを支援するための GDB のヘルパー関数です。https://sourceware.org/gdb/onlinedocs/gdb/Automatic-Overlay-Debugging.htmlを参照してください。

于 2015-02-24T13:54:04.663 に答える