Totalview: есть ли способ жестко закодировать точку останова?
У меня есть параллельная (MPI) программа c/ C++, которая время от времени приводит к ошибке при определенных условиях. Как только возникает ошибка, печатается сообщение и программа завершается; Я хотел бы установить точку останова, чтобы увидеть стек и более подробную информацию о том, что вызвало ошибку. Я использую TotalView для отладки, и мне бы хотелось, чтобы он остановился на точке останова в моей процедуре ошибки. Я бы хотел, чтобы он всегда автоматически устанавливал эту точку останова. Есть ли способ сделать это?
Я изучаю использование signal.h и повышение, но пока не ясно, как TotalView реагирует.
Глядя на этот вопрос, как вы останавливаетесь в TotalView после ошибки MPI? Похоже, что обработка исключений в C++, то есть throw(), автоматически вызовет остановку TotalView. Какой правильный способ сделать это в C?
2 ответа
В TotalView, пункт меню File > Signals открывает это окно:
Это для управления поведением по умолчанию в ответ на сигнальные вызовы. SIGTRAP и SIGSTOP зарезервированы, и, похоже, TotalView обрабатывает их по-разному. То есть raise(SIGSTOP)
не остановился, как ожидалось в TotalView.
Эта программа:
#include <signal.h>
main(int argc, char* argv[])
{
raise(SIGTRAP);
}
производит этот ответ:
Неожиданная ловушка не вызвана точкой останова!
А состояние программы указывается как "Выйти или не создано". Когда SIGTRAP заменяется на SIGSTOP, происходит тот же результат, но без сообщения "Неожиданно...".
Как показано на рисунке выше, SIGINT, SIGTSTP, SIGTTIN и SIGTTOU по умолчанию приводят TotalView к остановке, как если бы была точка останова.
Подобно ответу, предоставленному Mooing Duck ( Totalview: есть ли способ жестко закодировать точку останова?), Эти вызовы Повышение () могут быть дополнительно сделаны, если вы пытаетесь отладить:
#ifdef DEBUG
raise(SIGTSTP)
#endif
Это только один из многих способов получить желаемый эффект жестко заданной точки останова.
Я понятия не имею, что такое totalview, так что это может быть неприменимо.
В окнах: DebugBreak();
В сборке х86: __asm int 3;
В Linux: raise(SIGTRAP);
Для Windows у меня есть удобный макрос, который я использую: #define DEBUGME() do{if (IsDebuggerPresent()) DebugBreak();}while(0)
Что приводит к продолжению выполнения, если не подключен отладчик.