Почему windbg не разбирает половину моей функции? - PullRequest
1 голос
/ 03 сентября 2011

Справочная информация. Я использую windbg для диагностики причин мини-дампов из службы Microsoft WinQual.Я потратил время на правильную настройку с помощью PDB и бинарных файлов в том же месте, где они были построены, и мне очень повезло с windbg и этой настройкой.

Сегодня я столкнулся смини-дамп, где я действительно хотел бы просмотреть разборку, чтобы понять проблему, но windbg будет переворачивать только часть функции.

Моя функция выглядит так:

SomeStruct* STDCALL getThing(int id)
{
    S_ASSERT(a);
    S_ASSERT(b);
    S_ASSERT(c);
    SomeStruct* result = fn(id);
    S_ASSERT(d);
    return result;
}

S_ASSERT - это наш макрос, который в конечном итоге вызывает функцию, в которой выполняется инструкция int 3, даже в сборках выпуска.Я просто не могу сказать, какой из них был поражен без проверки разборки.

Используя windbg, я могу перейти к getThing в стеке вызовов, активировать разборку и увидеть некоторый код, но не могу прокрутить обратноразборка.Затем я добавил часы на module!getThing, чтобы получить адрес функции, и записал этот адрес в окне разборки.Вместо инструкции я получаю ~ 100 строк ???сопровождаемый некоторой разборкой, которая не похожа на точку входа функции, но выглядит как часть правильной функции.Это выглядит так:

No prior disassembly possible
module!getThing:
1d7d4aa0 ??              ???
1d7d4aa1 ??              ???
1d7d4aa2 ??              ???
...
1d7d4b0a 087d1c          or      byte ptr [ebp+1Ch],bh
1d7d4b0d 8b4004          mov     eax,dword ptr [eax+4]
1d7d4b10 8bf9            mov     edi,ecx
1d7d4b12 83e11f          and     ecx,1Fh
1d7d4b15 bb01000000      mov     ebx,1
...

Итак, как мне убедить windbg показать остальную часть разборки?С другой стороны, я неправильно понимаю результаты?Есть ли какое-либо другое программное обеспечение, способное загружать мини-дампы помимо Visual Studio?

Спасибо за любые идеи, которые вы можете предоставить!

1 Ответ

2 голосов
/ 03 сентября 2011

Убедитесь, что у вас есть копия того же dll или exe в пути символа (.sympath) или пути exe (.exepath).Используйте !sym noisy и .reload и убедитесь, что windbg находит эту dll.

...