2013-11-24 2 views
15

GDB를 통해 응용 프로그램을 실행할 수 있는지, SegFault에서 파일에 백 트레이스를 기록한 다음 (나중에 볼 때), 사용자 입력없이 GDB를 모두 종료 할 수 있는지 궁금합니다.사용자 입력이없는 gdb 백 트레이스?

비대화 형 세션에서 OS 부팅시 무한 루프 (붕괴되면 다시로드)되는 응용 프로그램을 쉘 스크립트에서 실행하고 있습니다. 응용 프로그램이 재현 할 수없는 방식으로 충돌하므로 문제를 디버그하기 위해 충돌에서 백 트레이스가 필요합니다. 이상적으로는 GDB 디버깅 + 백 트레이스 기능을 포함하도록 쉘 스크립트를 수정하고 크래시 이후 애플리케이션의 자동 재시작을 유지하는 것입니다.

이 작업을 수행 할 수 있습니까?

+2

http://www.commandlinefu.com/commands/view/4039/print-stack-trace-of-a-core-file-without-needing-to-enter-gdb-interactively –

+2

코어를 활성화 할 수 있습니까? 파일을 시스템에 저장하고 역 추적을 그렇게 할 수 있습니까? 그것은 gdb 루프보다 훨씬 쉬워 보입니다. –

+0

'그래서 문제를 디버깅하기 위해 충돌에서 백 트레이스가 필요합니다. '- 충돌에서 핵심 파일을 분석 할 수없는 이유에 대한 답을 찾지 못했습니까? 꽤 큰가? –

답변

17

덕분에 Aditya Kumar; 허용 솔루션 :

이 GDB 7.6와 함께 작동 gdb -batch -ex "run" -ex "bt" ${my_program} 2>&1 | grep -v ^"No stack."$

1

:

이 명령 줄 매개 변수 주어지면에서 핵심 덤프가 발생 내 테스트 프로그램 :

int a(int argc) 
{ 
    if (argc > 1) { 
    int *p = 0; 
    *p = *p +1; 
    return *p; 
    } 
    else { 
    return 0; 
    } 
} 

int b(int argc) 
{ 
    return a(argc); 
} 

int main(int argc, char *argv[]) 
{ 
    int res = b(argc); 
    return res; 
} 

내 파이썬 스크립트 my_check를 .py :

def my_signal_handler (event): 
    if (isinstance(event, gdb.SignalEvent)): 
    log_file_name = "a.out.crash." + str(gdb.selected_inferior().pid) + ".log" 
    gdb.execute("set logging file " + log_file_name) 
    gdb.execute("set logging on") 
    gdb.execute("set logging redirect on") 
    gdb.execute("thread apply all bt") 
    gdb.execute("q") 

gdb.events.stop.connect(my_signal_handler) 
gdb.execute("set confirm off") 
gdb.execute("set pagination off") 
gdb.execute("r") 
gdb.execute("q") 

그래서 우선 a.out 및 충돌은 없다. 어떤 로그 파일이 생성되지 않습니다 :

GDB -q -x my_check.py --args ./a.out>을/dev/null

다음 내가 a.out을 실행하고 그것을 하나 개의 매개 변수를 제공 :

>gdb -q -x my_check.py --args ./a.out 1 >/dev/null 

그리고이 충돌 보고서입니다 :

또는
>cat a.out.crash.13554.log 

Thread 1 (process 13554): 
#0 0x0000000000400555 in a (argc=2) at main.cpp:5 
#1 0x000000000040058a in b (argc=2) at main.cpp:15 
#2 0x00000000004005a3 in main (argc=2, argv=0x7fffffffe198) at main.cpp:20 
0

그냥 역 추적을 저장하기 위해, 당신이 012을 넣을 수 쉘 스크립트의 무한 루프 앞에이 있습니다. 결과는 프로그램이 segfaults 할 때마다 내 시스템에서 단지 core이라고하는 파일에 코어 덤프를 작성하지만 다른 시스템에서는 프로세스 ID를 포함 할 수 있습니다. 프로그램이 segfaults (종료 상태가 139 인 것을 볼 수 있습니다) 그러면 core 파일을 고유 한 이름 (예 : 타임 스탬프 사용)을 사용하여 안전한 위치로 이동하십시오. 이러한 핵심 파일과 gdb를 사용하면 역 추적 (backtrace)을 보는 것 이상의 것을 할 수 있습니다. 따라서 나는 그것들을 사용하는 것이 당신에게 더 유용 할 수도 있다고 생각합니다.

관련 문제