Не могу понять, что не так в моем коде

У меня есть файл дампа, который мне удалось создать из моей DLL, созданной для любого необработанного исключения.

Когда я делал что-то вроде int* tt = new int[4]; return int[n]; с n = 4, я получал файл дампа, мог открыть его и посмотреть, в какой строке возникает ошибка. Это было возможно как непосредственно из релизного exe, так и из релизной DLL.

Это была простая ошибка, и я ввел ее только для проверки создания дампа памяти.

Теперь у меня есть файл дампа размером 900 КБ, и в журнале событий говорится, что ошибка исходит из моей .DLL, но если я открою файл, он не отобразит исходный код.

Стек вызовов

KERNELBASE.dll!RaiseException() + 0x3d байт
clr.dll!RaiseTheExceptionInternalOnly() + 0x18f байт
clr.dll!IL_Throw() + 0xe2 байт
000007fe81f65fd7()
00000000034d1610()
000000002d06ecb8()
436f93ce00050011()
436f93cf00110012()
000000002d06ec50()
00006d930c4f7680()
clr.dll!InlinedCallFrame:()0ftable0()0

что совсем не помогает мне понять, откуда в DLL моя ошибка. Еще одна проблема с отладкой заключается в том, что это происходит только на живом ПК, но не в моей системе отладки. Может ли кто-нибудь помочь мне найти способ отладки этого? Кажется, это происходит при вызове DLL, но: не каждый раз, только как каждый второй раз (иногда с 1-й попытки, иногда с 5-й). Я совершенно потерялся в том, что здесь происходит.

Изменить: обновлен стек вызовов с загруженными символами Microsoft, но я до сих пор не знаю, откуда это может происходить.


person SinisterMJ    schedule 20.12.2012    source источник
comment
Это был просто способ доказать, что моя функция дампа памяти работает. Если я вызову его с return int[4]; Я получил бы ошибку доступа, такую ​​же, как и сейчас, но я не знаю, где может произойти ошибка доступа.   -  person SinisterMJ    schedule 20.12.2012


Ответы (1)


Вам нужно загрузить символы для kernelbase.dll. И, возможно, clr.dll.

Предположительно, вы используете визуальную студию? Настройте его для доступа к символам с сервера символов Microsoft: http://msdn.microsoft.com/en-us/library/b8ttk8zy(v=vs.80).aspx

Возможно, вам придется щелкнуть правой кнопкой мыши элементы в стеке вызовов и указать, чтобы он загружал символы.

Кроме того, не забудьте сохранить копию файла pdb для любых выпусков программного обеспечения, которое вы делаете.

person Pete    schedule 20.12.2012
comment
Хорошо, сделано, но это все еще чисто в Microsoft DLL, поэтому я не знаю, почему возникает исключение. Очевидно, это доступ к памяти, но я не знаю, почему. - person SinisterMJ; 20.12.2012
comment
Так что же дальше неизвестного в стеке вызовов? Загрузите символы для этого. Если это ваш исполняемый файл, добавьте путь символа к папке, содержащей эту версию исполняемого файла и файл pdb для этой версии. Затем заставьте его загружать символы для этой строки в стек вызовов. - person Pete; 20.12.2012
comment
В том-то и дело, что в стеке вызовов нет ничего от моего приложения. // хорошо, оказывается, ошибка была вызвана API камеры. Спасибо за подсказку с базой Microsoft Symbol! Смущает, однако, то, что он говорит, что причиной является моя DLL, но DLL вообще не использует API камеры... - person SinisterMJ; 20.12.2012