2016-12-06 61 views
2

我想在gdb中創建回溯(在腳本中)。命令bt 2只打印2個最裏面的幀,而bt -2只打印2個最外面的幀。在回溯中跳過最裏面的幀

我想要做的是跳過 2個最裏面的幀,並顯示所有的外框。我試過

up 2 
bt 

(以及類似up-silentlyframeselect-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時,我正在禁用python腳本自動加載,所以它需要一些工作。)我真的很驚訝似乎沒有簡單的方法來設置當前幀。 – jdm

回答

0

您對「bt」的說法取決於當前存在的幀數。這大概也可以在gdb直接(不知道)來完成,但是這個python腳本正是這樣做的:

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將打印回溯。