2014-12-21 3 views
1

У меня есть ошибка в моем приложении, которая работает на удаленном сервере. После нескольких часов исполнения приложение получает SIGSEGV и завершается.отлаживать процесс с помощью gdb и закрывать терминал

Я хочу отладить мое удаленное приложение с помощью gdb через ssh, поэтому, когда программа получит SIGSEGV gdb, она остановится и позволит мне увидеть, что произошло, но я не могу оставить сеанс ssh подключенным сервером. Я пытаюсь запустить:

setsid gdb my_app 

но когда я закрываю SSH терминал, GDB и мое приложение немедленно прекращено.

Мои вопросы:

  • Как я могу оставить GdB работает при закрытии терминала
  • Как можно повторно подключиться к ней позже?

strace на БГД на момент закрытия терминала показывает:

read(0, 0x7fff0532895f, 1)    = -1 EIO (Input/output error) 
ioctl(0, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, 0x7fff05328930) = -1 EIO (Input/output error) 
ioctl(0, SNDCTL_TMR_STOP or SNDRV_TIMER_IOCTL_GINFO or TCSETSW, {B38400 opost isig -icanon -echo ...}) = -1 EIO (Input/output error) 
rt_sigaction(SIGINT, {0x5b3550, [INT], SA_RESTORER|SA_RESTART, 0x7fa0fbaa0c90}, {0x7fa0fce86ac0, [], SA_RESTORER, 0x7fa0fbaa0c90}, 8) = 0 
rt_sigaction(SIGTERM, {0x5b3710, [TERM], SA_RESTORER|SA_RESTART, 0x7fa0fbaa0c90}, {0x7fa0fce86ac0, [], SA_RESTORER, 0x7fa0fbaa0c90}, 8) = 0 
rt_sigaction(SIGHUP, {0x5b33d0, [HUP], SA_RESTORER|SA_RESTART, 0x7fa0fbaa0c90}, {0x7fa0fce86ac0, [], SA_RESTORER, 0x7fa0fbaa0c90}, 8) = 0 
rt_sigaction(SIGQUIT, {0x5b33f0, [QUIT], SA_RESTORER|SA_RESTART, 0x7fa0fbaa0c90}, {0x7fa0fce86ac0, [], SA_RESTORER, 0x7fa0fbaa0c90}, 8) = 0 
rt_sigaction(SIGALRM, {SIG_DFL, [], SA_RESTORER, 0x7fa0fbaa0c90}, {0x7fa0fce86ac0, [], SA_RESTORER, 0x7fa0fbaa0c90}, 8) = 0 
rt_sigaction(SIGTSTP, {SIG_DFL, [TSTP], SA_RESTORER|SA_RESTART, 0x7fa0fbaa0c90}, {0x7fa0fce86ac0, [], SA_RESTORER, 0x7fa0fbaa0c90}, 8) = 0 
rt_sigaction(SIGTTOU, {SIG_DFL, [], SA_RESTORER, 0x7fa0fbaa0c90}, {0x7fa0fce86ac0, [], SA_RESTORER, 0x7fa0fbaa0c90}, 8) = 0 
rt_sigaction(SIGTTIN, {SIG_DFL, [], SA_RESTORER, 0x7fa0fbaa0c90}, {0x7fa0fce86ac0, [], SA_RESTORER, 0x7fa0fbaa0c90}, 8) = 0 
rt_sigaction(SIGWINCH, {0x4efb70, [], SA_RESTORER, 0x7fa0fbaa0c90}, {0x7fa0fce86160, [], SA_RESTORER|SA_RESTART, 0x7fa0fbaa0c90}, 8) = 0 
rt_sigaction(SIGTSTP, {0x5b3410, [TSTP], SA_RESTORER|SA_RESTART, 0x7fa0fae70da0}, {SIG_DFL, [TSTP], SA_RESTORER|SA_RESTART, 0x7fa0fbaa0c90}, 8) = 0 
ioctl(0, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, 0x7fff053288e0) = -1 EIO (Input/output error) 
write(1, "quit\n", 5)     = -1 EIO (Input/output error) 
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0 
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0 
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0 
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0 
rt_sigaction(SIGINT, {0x5b3550, [INT], SA_RESTORER|SA_RESTART, 0x7fa0fae70da0}, {0x5b3550, [INT], SA_RESTORER|SA_RESTART, 0x7fa0fbaa0c90}, 8) = 0 
rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x7fa0fbaa0c90}, {0x5b3550, [INT], SA_RESTORER|SA_RESTART, 0x7fa0fae70da0}, 8) = 0 
exit_group(0)       = ? 
+++ exited with 0 +++ 

ответ

1

Вы можете использовать что-то вроде «экран», он будет продолжать работать, если вы отсоединить от него (CTRL-A d) , затем вы можете снова подключиться к «screen -r».

Или вы можете повторно подключить gdb к имени прогамы и PID, например. 'gdb my_app 1234', где номер 1234 должен быть заменен на правильный PID.

+0

экрана хорошее предложение (или tmux), но реплантации с GDB не будет работать, если программа уже завершила с SIGSEGV. –

1

Включите дамп:

ulimit -c unlimited 

Затем выполнить программу (вызывая ошибки SEG), и вы должны увидеть «ошибку сегментации (ядро сбрасывало)», когда процесс сбоит систему сохранит дамп, вы сможете анализировать его, когда захотите, даже если вы потеряли соединение.

Затем запустите gdb -c core

+0

Чтобы добраться до этого момента, вам нужно будет использовать nohup или что-то подобное, чтобы ваше приложение продолжало работать после отключения. Если ваше приложение записывается на терминал, вам нужно будет перенаправить его вывод в файл. –