Totalview: есть ли способ жестко закодировать точку останова?

У меня есть параллельная (MPI) программа c/ C++, которая время от времени приводит к ошибке при определенных условиях. Как только возникает ошибка, печатается сообщение и программа завершается; Я хотел бы установить точку останова, чтобы увидеть стек и более подробную информацию о том, что вызвало ошибку. Я использую TotalView для отладки, и мне бы хотелось, чтобы он остановился на точке останова в моей процедуре ошибки. Я бы хотел, чтобы он всегда автоматически устанавливал эту точку останова. Есть ли способ сделать это?

Я изучаю использование signal.h и повышение, но пока не ясно, как TotalView реагирует.

Глядя на этот вопрос, как вы останавливаетесь в TotalView после ошибки MPI? Похоже, что обработка исключений в C++, то есть throw(), автоматически вызовет остановку TotalView. Какой правильный способ сделать это в C?

2 ответа

Решение

В TotalView, пункт меню File > Signals открывает это окно:

Окно сигналов TotalView

Это для управления поведением по умолчанию в ответ на сигнальные вызовы. 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)
Что приводит к продолжению выполнения, если не подключен отладчик.

Другие вопросы по тегам