2013-09-08 6 views
1

Я отлаживаю приложение и по какой-то причине (что я не совсем уверен) при закрытии моего приложения abort(). Я хотел бы попытаться найти причину этого, поэтому я хочу разместить точку останова на abort(), чтобы я мог видеть трассировку стека и, надеюсь, обнаружил причину, по которой он был вызван, вместо изящного выхода.Установка точки останова при вызове abort()

Я использую Microsoft Visual Studio 2012 (обновление 3) и имеет только объявление для функции abort()stdlib.h), и поэтому я не могу установить точку останова. Есть ли способ обойти это?

+3

Ctrl + D, N. Введите «abort» для имени функции. –

+1

@HansPassant Мне пришлось использовать Ctrl-B, но это сработало, спасибо вам очень много! Проблема в том, что я неправильно обрабатывал один из моих потоков, поэтому деструктор назывался 'abort()' !! –

ответ

3

Вам не нужно ничего делать специальным. abort вызова из программы на C/C++ построен Visual Studio производит следующее сообщение:

 
--------------------------- 
Microsoft Visual C++ Debug Library 
--------------------------- 
Debug Error! 
Program: ... 
R6010 
- abort() has been called 
(Press Retry to debug the application) 
--------------------------- 
Abort Retry Ignore 
--------------------------- 

Нажатие кнопки Retry открывает отладчик с полным стеком вызовов. Эта функциональность доступна как для конфигураций Debug, так и для Release, когда программа работает в автономном режиме и под отладчиком. В конфигурации Release диалог отличается, он содержит кнопку Break, которая открывает отладчик, например Retry in Debug configuration.

+0

Привет, Алекс, спасибо за ваш ответ, я получаю подобное сообщение в поле «Отладка» в Visual Studio, но я не получаю диалоговое окно с кнопкой «Повторить», которую я могу нажать (я предполагаю, потому что я уже закрытие приложения на данный момент)? –

+0

Согласно MSDN: «Когда приложение связано с отладочной версией библиотек времени выполнения, abort создает окно с тремя кнопками:« Прерывание, повтор и игнорирование ». –

+0

В моем тесте он работает, чтобы построить версию Debug CRT, есть следующий вариант: C/C++ - Генерация кода - Библиотека времени выполнения - Многопоточная DLL-отладка. –

0

Только для отладки вы можете переопределить функцию abort и установить контрольную точку внутри.

void abort() 
{ 
    std::cout << "aborting" << std::endl; // put break here... 
    exit(-1); 
} 
0

В случае Linux gdb после удара abort, вы можете легко видеть трассировки стека с помощью команды bt. Не нужно добавлять дополнительную точку останова.