Я просматривал стеки потоков 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();
}
Возникает вопрос: почему кажется, что хром тратит так много времени на функцию, которая предназначена только для отладки и почти пуста в хроме?
Обратите внимание на массивные смещения, такие как 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
Кроме того, эта функция на самом деле является вспомогательной функцией для GDB, чтобы помочь отладке оверлеев. Увидеть https://sourceware.org/gdb/onlinedocs/gdb/Automatic-Overlay-Debugging.html.