Я новичок в windbg и анализ памяти в windows.
Я пытаюсь проанализировать дамп памяти (аварийный дамп), это система x64.
После загрузки всех символов (мой и майкрософт)
Я печатаю !analyze -v
Это часть вывода:
......
FAULTING_SOURCE_CODE: <some code here>
SYMBOL_STACK_INDEX: 6
SYMBOL_NAME: rtplogic!CSRTPStack::Finalize+19d
FOLLOWUP_NAME: MachineOwner
MODULE_NAME: RTPLogic
IMAGE_NAME: RTPLogic.dll
DEBUG_FLR_IMAGE_TIMESTAMP: 58542837
STACK_COMMAND: ~544s; .ecxr ; kb
FAILURE_BUCKET_ID: WRONG_SYMBOLS_c0000374_RTPLogic.dll!CSRTPStack::Finalize
BUCKET_ID: X64_APPLICATION_FAULT_WRONG_SYMBOLS_rtplogic!CSRTPStack::Finalize+19d
......
это WRONG_SYMBOLS
беспокоит меня
Могу ли я быть уверен, код в FAULTING_SOURCE_CODE
это код, связанный с падением?
Нет, к сожалению, вы не можете доверять этому. В анализе стека вызовов есть, по крайней мере, один момент, когда отладчик не был уверен на 100%, правильно ли он развернул стек.
Когда вы печатаете ~544s; .ecxr; k
вы увидите стек вызовов. Этот стек вызовов будет включать предупреждение в тот момент, когда он станет неопределенным. Вы можете доверять всему раньше, что уже может помочь, но вы не можете доверять кадрам стека под предупреждением.
Вы можете сравнить k
вывод на dps @ebp
(возможно добавить L fff
если этого недостаточно), чтобы увидеть, что еще мог догадаться отладчик.
Обратите внимание, что в выводе dps
Вы также можете увидеть совершенно не связанные вещи, если случайно один из ваших расчетов в стеке привел к значению, которое можно интерпретировать как символ.
c0000374
это STATUS_HEAP_CORRUPTION
, Просмотр нормального дампа показывает код только после того, как произошло повреждение.
активировать Pageheap
с gflags.exe для вашего exe
PageHeap позволяет функциям Windows, которые резервируют память на границе каждого выделения, обнаруживать попытки доступа к памяти за пределами выделения. Это приведет к аварийному завершению работы приложения, и здесь вы увидите реальную причину сбоя. Откройте DMP и запустите !analyze -v
чтобы увидеть, что искажается.