2014-12-21 6 views
1

원격 서버에서 실행되는 어플리케이션에 버그가 있습니다. 몇 시간의 실행 후 응용 프로그램은 SIGSEGV를 가져 와서 종료합니다.gdb로 프로세스를 디버그하고 터미널을 닫으십시오.

원격 응용 프로그램을 gdb로 디버깅하고 싶습니다. 프로그램이 SIGSEGV를 얻었을 때 gdb가 멈추고 무슨 일이 있었는지 알 수있게되지만 연결된 서버에 ssh 세션을 남길 수는 없습니다.

setsid gdb my_app 

을하지만 난 SSH 터미널, GDB를 닫고 때 내 응용 프로그램은 즉시 종료 : 나는 실행하는 데 노력하고있어.

내 질문 :

  • 어떻게 나중에 다시 연결을 할 수있는 터미널을 닫을 때

    • 어떻게 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를 progam 이름 및 PID와 다시 연결할 수 있습니다 (예 : 'gdb my_app 1234', 여기서 번호 1234는 올바른 PID로 대체되어야합니다. 코어 덤프에

    +0

    화면 좋은 제안 (또는 TMUX)는 시작하지만, 프로그램이 이미 SIGSEGV와 함께 종료 된 경우 GDB와 다시 연결하면 작동하지 않습니다. –

    1

    켭,

    ulimit -c unlimited 
    

    그런 다음 프로그램 (원인 세그 폴트)를 실행하고 프로세스가 덤프를 저장 할 시스템 충돌 할 때, "(코어 덤프) 분할 오류"를 참조한다 연결이 끊긴 경우에도 원할 때 분석 할 수 있습니다.

    그런 다음 gdb -c core

    +0

    이 시점을 얻으려면 연결을 끊은 후에도 응용 프로그램을 계속 실행할 수 있도록 nohup 또는 비슷한 것을 사용해야합니다. 응용 프로그램이 터 L 널에 기록하는 경우 출력을 파일로 재지 정해야합니다. –