Как сделать так, чтобы отладчик VC ++ прерывал работу исключений?

Я пытаюсь отладить проблему в библиотеке DLL, написанной на C, которая продолжает вызывать нарушения доступа. Я использую Visual C ++ 2008, но код на C.

Я привык к Delphi, где, если во время работы под отладчиком возникает исключение, программа немедленно переключается на отладчик и дает вам возможность проверить состояние программы. Однако в Visual C ++ все, что я получаю, - это сообщение на вкладке «Вывод»:

First-chance exception at blah blah blah: Access violation reading location 0x04410000. Никаких перерывов, ничего. Он просто идет и раскручивает стек, пока он не вернется в мой Delphi EXE, который распознает что-то не так и предупредит меня об этом, но к этому моменту я потерял несколько уровней стека вызовов, и я не знаю, что происходит.

Я пробовал другие методы отладки, но все, что он делает, происходит глубоко внутри вложенного цикла внутри макроса C, который вызывается более 500 раз, и это немного выходит за рамки моих навыков (или моего терпения), чтобы отследить его.

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

Кто-нибудь знает где это и как включить?


person Mason Wheeler    schedule 14.04.2010    source источник


Ответы (2)


В меню Отладка выберите Исключения и установите флажки рядом с исключениями, которые должны отключаться отладчиком. «Нарушение прав доступа» находится в разделе «Исключения Win32».

person James McNellis    schedule 14.04.2010
comment
@ Мейсон: Нет проблем. Я не думаю, что какие-либо из них отмечены по умолчанию. Я предполагаю, что при включении прерывания по исключению наблюдается довольно значительное снижение производительности (хотя я действительно не знаю). - person James McNellis; 15.04.2010
comment
Я бы так не подумал. Я не очень хорошо знаю C ++, но в Delphi потеря производительности равна нулю, пока он не сломается на одном, и когда (если) это произойдет, это обычно означает, что что-то пошло не так, и отладчик находится именно там, где вы хотите быть. - person Mason Wheeler; 15.04.2010
comment
@ Мейсон: Я согласен, я всегда думал, что это плохое поведение по умолчанию. - person BlueRaja - Danny Pflughoeft; 15.04.2010
comment
Похоже, что в MSVC 2015 это скрыто в разделе Отладка ›Windows› Параметры исключений. Мне потребовалась вечность, чтобы найти его! - person s3cur3; 21.02.2019

Вы также можете создать точку останова по данным, используя адрес, указанный в строке «Первая возможность исключения в ...».

Следуя ответу Джеймса, исключения, которые вы ищете, находятся в разделе исключений Win32. Вы должны увидеть там нарушение прав доступа.

person Mark Ingram    schedule 14.04.2010
comment
Это сработает? Это считывание ошибки, и точки останова данных AFAIK срабатывают только в том случае, если вы измените значение по рассматриваемому адресу. - person Mason Wheeler; 15.04.2010
comment
Вы также можете прервать выполнение, когда выполнение достигнет определенного места (я думаю, что это просто опция в диалоговом окне свойств точки останова). - person Mark Ingram; 15.04.2010