2016-12-06 6 views
2

Я хотел бы создать backtrace в gdb (в скрипте). Команда bt 2 печатает только 2 самых внутренних кадра, а bt -2 печатает только 2 самых внешних кадра.Пропустить самые внутренние кадры в backtrace

Что бы я хотел сделать, это skip 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 Спасибо за ссылку. Это будет вариант, но это, вероятно, слишком велико для такой косметической проблемы. (Кроме того, я в настоящее время отключил автозагрузку скрипта python, когда я вызываю 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), источник его в БГД (источник tbt.py) , Теперь у вас есть новая команда tbt. tbt N будет печатать обратную линию для всех, кроме верхних N кадров.

 Смежные вопросы

  • Нет связанных вопросов^_^