Ответ 1
Этот script, не написанный мной, довольно печатает контейнеры STL, такие как вектор, карта и т.д.: http://www.yolinux.com/TUTORIALS/src/dbinit_stl_views-1.03.txt
Совершенно удивительный.
Люди используют gdb для отладки, конечно, есть много других инструментов отладки через различные ОС, с графическим интерфейсом и без него, возможно, другие причудливые функции IDE.
Я хотел бы знать какие полезные скрипты gdb, которые вы написали и которые вам понравились.
Хотя я не имею в виду дамп команд в файле something.gdb
, который вы используете, чтобы вытащить кучу данных, если это сделало ваш день, поговорите об этом.
Позвольте мне привести простой пример в качестве примера...
Скажем,
A script, который чередуется последовательно над записями
найти плохой вход в большой хэш-таблице
который реализован на встроенной платформе.
Это помогло мне однажды отладить сломанную таблицу хэшей.
Этот script, не написанный мной, довольно печатает контейнеры STL, такие как вектор, карта и т.д.: http://www.yolinux.com/TUTORIALS/src/dbinit_stl_views-1.03.txt
Совершенно удивительный.
При отладке аварии AOLserver SIGSEGV я использовал следующий script для проверки стека вызовов уровня TCL из GDB:
define tcl_stack_dump
set $interp = *(Interp*)interp
set $frame = $interp->framePtr
while (0 != (CallFrame *)$frame->callerPtr != 0)
set $i = 0
if 0 != $frame->objv
while ($i < $frame->objc)
if (0 != $frame->objv[$i] && 0 != $frame->objv[$i]->bytes)
printf " %s", (char *)(CallFrame *)$frame->objv[$i]->bytes
end
set $i = $i + 1
end
printf "\n"
end
set $frame = (CallFrame *)$frame->callerPtr
end
end
document tcl_stack_dump
Print a list of TCL procs and arguments currently being called in an
interpreter. Most TCL C API functions beginning with Tcl[^_] will have a
Tcl_Interp parameter. Assumes the `interp' local C variable holds a
Tcl_Interp which is represented internally as an Interp struct.
See:
ptype Interp
ptype CallFrame
ptype Proc
ptype Command
ptype Namespace
ptype Tcl_Obj
end
1. При попытке получить некоторые сторонние DLL с закрытыми исходными кодами, работающие с нашим проектом под Mono, он дает бессмысленные ошибки. Следовательно, я прибегал к сценариям из Mono project.
2. У меня также был проект, который мог бы сбрасывать собственную информацию в stdout для использования в GDB, поэтому в точке останова я мог бы запустить эту функцию, а затем вырезать-вставить ее вывод в GDB.
[изменить]
3. Большая часть моего использования GCC/g++ прошла некоторое время, но я также вспоминаю использование макроса, чтобы воспользоваться тем фактом, что GDB знал членов некоторых непрозрачных данных, которые у меня были ( библиотека была скомпилирована с помощью отладки). Это было чрезвычайно полезно.
4. И я тоже нашел это. Он выгружает список объектов (из глобального "SLM" headMeterFix), которые содержат, помимо прочего, динамические массивы другого типа объекта. Один из нескольких раз, когда я использовал вложенные циклы в макросе:
define showFixes
set $i= headMeterFix
set $n = 0
while ($i != 0)
set $p = $i->resolved_list
set $x = $i->resolved_cnt
set $j = 0
printf "%08x [%d] = {", $i, $x
printf "%3d [%3d] %08x->%08x (D/R): %3d/%-3d - %3d/%-3d {", $n, $i, $x, $i->fix, $i->depend_cnt, dynArySizeDepList($i->depend_list), $i->resolved_cnt, dynArySizeDepList($i->resolved_list)
while ($j < $x)
printf " %08x", $p[$j]
set $j=$j+1
end
printf " }\n"
set $i = $i->next
set $n = $n+1
end
end