Чтобы отследить сбой в Qt, который происходит только на компьютере пользователя Windows 8, я настроил локальный сервер символов для отладки дампов сбоя.
Сначала я сделал полную сборку со следующими установленными флагами:
QMAKE_CFLAGS_RELEASE += -Zi
QMAKE_CXXFLAGS_RELEASE += -Zi
QMAKE_LFLAGS_RELEASE += /DEBUG /OPT:REF
и построил установщик, используя установщик Windows и проект развертывания VS. Затем я запустил следующую команду symstore.exe:
C:\Program Files (x86)\Windows Kits\8.1\Debuggers\x64>symstore.exe add /r /f C:\builddir\*.* /s "C:\Users\Sam\symbols" /t "Application" /v "rev xxxx" /c "test add"
Это создало соответствующие папки dll, exe и pdb внутри C:\Users\Sam\symbols
,
Затем я установил на компьютере пользователя и с помощью Process Explorer сгенерировал файл мини-дамп. Я попытался загрузить дамп в Visual Studio и добавить C:\Users\Sam\symbols
к местоположениям файла символов, но не найдено соответствующих символов для моих двоичных файлов.
Затем я попытался загрузить его в WinDbg64 (это 64-битное приложение). Я поставил !sym noisy
установите путь к символу с помощью .symfix C:\Users\Sam\symbols
и перезагрузил с .reload /f
, Это также не имело успеха, и только символы экспорта были загружены. Например:
QtGui4 No data is available : SRV*C:\Users\Sam\symbols*http://msdl.microsoft.com/download/symbols
The SYMSRV client failed validating the GUID for the module, or the
module does not have the debug header information.
Это происходит для всех модулей, но я не ожидал бы этого вообще для компонентов Qt, так как они не собраны как часть обычной сборки, и даже установка папки символов в папку lib, непосредственно содержащую файлы pdb, не помогает.
Затем я попытался запустить ChkMatch.exe
против исполняемого файла и файла pdb в моем хранилище символов. Подпись исполняемого файла совпадает с папкой, в которой находится pdb, что указывает на то, что они должны совпадать, но затем я получил следующую ошибку:
Debug information file:
Format: PDB 7.00
Error: PDB header - too many pages in root stream.
Я побежал ChkMatch.exe
снова против установленного исполняемого файла на всякий случай, но получил ту же подпись и ту же ошибку.
Редактировать:
Я пробовал настройку symopt+0x40
что должно заставить WinDbg использовать pdbs в любом случае, не слишком тщательно проверяя GUID подписи. Однако он все еще ничего не загружает. Дополнительный вывод:
SYMSRV: C:\Users\Sam\symbols\QtGui4.dll\5202030497e000\QtGui4.dll not found
...
SYMSRV: C:\Users\Sam\symbols\QtGui4.dbg\5202030497e000\QtGui4.dbg not found
SYMSRV: http://msdl.microsoft.com/download/symbols/QtGui4.dbg/5202030497e000/QtGui4.dbg not found
DBGHELP: .\QtGui4.dbg - file not found
DBGHELP: .\dll\QtGui4.dbg - path not found
DBGHELP: .\symbols\dll\QtGui4.dbg - path not found
DBGHELP: QtGui4.dll missing debug info. Searching for pdb anyway
DBGHELP: Can't use symbol server for QtGui4.pdb - no header information available
DBGHELP: QtGui4.pdb - file not found
*** ERROR: Symbol file could not be found. Defaulted to export symbols for QtGui4.dll -
DBGHELP: QtGui4 - export symbols
Папка в C:\Users\Sam\symbols\QtGui4.dll
имеет имя 4AA92D1B712000
и содержит то, что должно быть правильным DLL.
Мне удалось решить это самостоятельно в конце концов. Сначала мне пришлось удалить и заново создать хранилище символов с нуля, используя описанные выше шаги. Я думаю, что сначала я испортил свой магазин, запустив symstore.exe
дважды с одинаковым номером версии в разных папках.
Сделав это, я смог загрузить аварийные дампы и увидеть символы для библиотек Qt, но только до двадцати кадров и ни один из других модулей не был загружен. Затем я хотел скопировать этот стек, но не смог из окна стека в WinDbg
и так нашел k
Команда распечатать стопку. Это было «Ага!» момент, потому что k
Команда распечатала намного больше, чем окно стека и обнаружила переполнение стека. Я обнаружил, что может быть передан дополнительный параметр для глубины стека для печати и k 0xFFFF
распечатал всю стопку.
Для работы с minidump вы также должны загрузить бинарные файлы в symstore