Totalview: есть ли способ жестко закодировать точку останова? - PullRequest
1 голос
/ 13 августа 2011

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

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

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

Ответы [ 2 ]

4 голосов
/ 15 августа 2011

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

TotalView Signals Window

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

Это всего лишь один из многих способов получить желаемый эффект жестко закодированной точки останова.

4 голосов
/ 13 августа 2011

Понятия не имею, что такое totalview, поэтому это может быть неприменимо.

В окнах: DebugBreak();
В сборке x86: __asm int 3;
В Linux: raise(SIGTRAP);

Для Windows один, у меня есть удобный макрос, который я использую:
#define DEBUGME() do{if (IsDebuggerPresent()) DebugBreak();}while(0)
, который заставляет выполнение продолжатьсяесли отладчик не подключен.

...