2013-05-09 3 views
2

내 프로그램에는 100 개의 스레드가 있으며, 대부분 유휴 상태이며 유휴 상태 일 때 매우 잘 정의 된 백 트레이스를 공유합니다. 대부분 유휴 상태가 아니므로 "공통"백 트레이스가없는 스레드에만 관심이 있습니다. 나는 gdb 스크립트를 사용하는 것이 좋은 방법이라고 생각했다.gdb 스크립트를 사용하여 백 트레이스 출력을 가지 치기

define backtraces 
    thread apply all bt 
end 

이 스크립트는 모든 백 트랙을 인쇄합니다. 이 출력을 변수에 저장하여 관련 백 트레이스 만 처리, 잘라 내기 및 표시 할 수있는 방법이 있습니까?

가 나는 순진하게도 시도 :

define backtraces 
    set $bts = thread apply all bt 
    // do whatever processing here 
end 

그러나 예상대로 다음과 같이 실패

없음 기호 "스레드"현재 상황에서.

더 좋은 방법이 있나요? 또는 gdb에서 스크립트의 전원을 켜는 방법에 대한 좋은 자습서가 있습니까?

답변

1

Employed Russian의 답변에있는 링크를 사용하여 뭔가 효과가있었습니다. 그것이 완전히 비 명백했기 때문에 여기에서 후손을위한 것입니다.

source traces.py 

도이 파이썬 스크립트를 호출 할 수있는 다른 방법이있다 :이 경우

import gdb 

# This loops through all the Thread objects in the process 
for thread in gdb.selected_inferior().threads(): 

    # This is equivalent to 'thread X' 
    thread.switch()  

    print "Thread %s" % thread.num 

    # Just execute a raw gdb command 
    gdb.execute('bt') 

    framesNames = [] 
    f = gdb.newest_frame() 
    while f is not None: 
     framesNames.append(gdb.Frame.name(f)) 
     f = gdb.Frame.older(f) 

    # do something with the name of each frame 

은 그냥 파이썬을 실행할 수 있습니다 gdb로에서 traces.py라는 이름의 파일에 있었다.

관련 문제