2016-12-06 12 views
2

gdb (스크립트 내)에 백 트레이스를 만들고 싶습니다. bt 2 명령은 가장 안쪽에있는 프레임 2 개만 인쇄하고 bt -2은 가장 바깥 쪽 프레임 2 개만 인쇄합니다.백 트레이스의 가장 안쪽 프레임 건너 뛰기

내가하고 싶은 것은 입니다. 두 개의 가장 안쪽 프레임을 건너 뛰고 모든 외부 프레임을 보여줍니다. 나는

up 2 
bt 

(유사 up-silently, frame, select-frame)를 시도했습니다,하지만 bt의 출력에는 영향을 미치지 않는다. 명확하게 말하자면이 출력에서 ​​첫 줄부터 제거하고 싶습니다.

#0 0x0000003167e0f33e in waitpid() from /lib64/libpthread.so.0 
#1 0x00007f2779835de8 in print_trace()() at /path/to/MyAnalysis.cxx:385 
#2 0x00007f2779836ec9 in MyAnalysis::getHistHolder(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)() at /path/to/MyAnalysis.cxx:409 
#3 0x00007f27798374aa in MyAnalysis::execute()() at /path/to/MyAnalysis.cxx:599 
#4 0x00007f2783a9670f in EL::Worker::algsExecute()() from /blah/lib/libEventLoop.so 
... 

어떤 방법 으로든이 작업을 수행 할 수 있습니까?

return을 두 번 호출하면 작동하지만 응용 프로그램이 잘못된 상태로 남아 있기 때문에 사용할 수 없습니다.

+1

downvoters가이 질문에 무엇이 잘못되었는지 설명해 주시겠습니까? – jdm

+0

자신의 필터를 쓰는 것이 옵션일까요? https://sourceware.org/gdb/onlinedocs/gdb/Writing-a-Frame-Filter.html –

+0

@ MarcusMüller 링크를 제공해 주셔서 감사합니다. 그것은 선택 일 것이다. 그러나 그러한 외관상의 문제는 아마도 과잉이다. (현재 gdb를 호출 할 때 파이썬 스크립트 자동 로딩 기능을 사용하지 않기 때문에 약간의 작업이 필요할 것입니다.) 현재 프레임을 설정하는 간단한 방법이없는 것 같습니다. – jdm

답변

0

"bt"에 대한 귀하의 주장은 현재 존재하는 프레임 수에 따라 다릅니다. 아마 이것은 또한 gdb를 직접 (확인되지 ​​않음)에서 할 수 있지만, 파이썬 스크립트가 수행 정확히 :

import gdb 

class TopBt (gdb.Command): 
    """ tbt n Shows backtrace for top n frames """ 

    def __init__ (self): 
     super(TopBt, self).__init__ ("tbt", gdb.COMMAND_DATA) 

    def framecount(): 
     n = 0 
     f = gdb.newest_frame() 
     while f: 
      n = n + 1 
      f = f.older() 
     return n 

    def invoke (self, arg, from_tty): 
     top = int(arg[0]) 
     btarg = -(TopBt.framecount() - top) 
     if btarg < 0: 
      gdb.execute("bt " + str(btarg)) 
TopBt() 

저장이 일부 파일 (tbt.py), GDB에서 소스 (소스 tbt.py) . 이제 새로운 명령이 생겼습니다. tbt N은 상위 N 개 프레임을 제외한 모든 백 트레이스를 인쇄합니다.