Улучшить макрос GDB - PullRequest
4 голосов
/ 21 мая 2010

У меня есть этот макрос GDB, который используется для печати значимых стековых трасс при отладке моно среды выполнения. Он перебирает все фреймы стека, выясняет, является ли этот фрейм собственным или управляемым. Если им управляют, он использует информацию из mono_pmip (), чтобы напечатать приличное описание этого кадра. Если он является нативным, он вызывает GDB «frame» для описания фрейма.

define mono_backtrace
 select-frame 0
 set $i = 0
 while ($i < $arg0)
   set $foo = mono_pmip ($pc)
   if ($foo == 0x00)
     frame
   else
     printf "#%d %p in %s\n", $i, $pc, $foo
   end
   up-silently
   set $i = $i + 1
 end
end

Два вопроса, связанных с этим:

Как я могу удалить аргумент $ arg0 и сделать так, чтобы он зацикливался на всех кадрах, пока не достигнет вершины стека?

Как я могу получить "frame" (или альтернативу), чтобы печатать только имя функции (как это делает bt), а не фактическую строку исходного кода в этой функции ?. Токовый выход:

#1  0x000c21f6 in mono_handle_exception (ctx=0xbfffe7f0, obj=0x64bf18, original_ip=0x65024a, test_only=0) at mini-exceptions.c:1504
1504        return mono_handle_exception_internal (ctx, obj, original_ip, test_only, NULL, NULL);
#2  0x00115b92 in mono_x86_throw_exception (regs=0xbfffe850, exc=0x64bf18, eip=6619722, rethrow=0) at exceptions-x86.c:438
438     mono_handle_exception (&ctx, exc, (gpointer)eip, FALSE);

В то время как я хотел бы, чтобы вывод соответствовал тому, что делает bt:

#1  0x000c21f6 in mono_handle_exception (ctx=0xbfffe7f0, obj=0x64bf18, original_ip=0x65024a, test_only=0) at mini-exceptions.c:1504
#2  0x00115b92 in mono_x86_throw_exception (regs=0xbfffe850, exc=0x64bf18, eip=6619722, rethrow=0) at exceptions-x86.c:438

Ответы [ 2 ]

0 голосов
/ 29 марта 2018

up-silently не работает с thread apply all, потому что фактически останавливает всю обработку команд при ошибках.Таким образом, невозможно получить обратную трассировку для всех потоков.

Мне удалось обойти это, используя небольшое количество кода Python.

python
class Frame_Valid (gdb.Function):
  def __init__ (self):
    super (Frame_Valid, self).__init__ ("frame_valid")

  def invoke (self):
    return gdb.selected_frame().is_valid()

Frame_Valid ()
end

define mono_backtrace
 set $i = 0
 select-frame $i
 while ($frame_valid())
   set $foo = (char*) mono_pmip ($pc)
   if ($foo)
     printf "#%d %p in %s\n", $i, $pc, $foo
   else
     frame
   end
   set $i = $i + 1
   select-frame $i
 end
end
0 голосов
/ 02 октября 2011

Как я могу удалить аргумент $ arg0 и сделать так, чтобы он зацикливался на всех кадрах, пока не достигнет вершины стека?

Просто сделай while (1). В конечном итоге up-silently не удастся, и оценка остановится.

Как я могу получить "frame" (или альтернативу), чтобы печатать только имя функции (как это делает bt), а не фактическую строку исходного кода в этой функции?

В GDB 7.3 фреймы были представлены Python , что дает вам более тонкий программный контроль над ними.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...