У меня есть этот макрос 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