Подтвердить что ты не робот

Какие полезные сценарии GDB вы использовали/писали?

Люди используют gdb для отладки, конечно, есть много других инструментов отладки через различные ОС, с графическим интерфейсом и без него, возможно, другие причудливые функции IDE.

Я хотел бы знать какие полезные скрипты gdb, которые вы написали и которые вам понравились.
Хотя я не имею в виду дамп команд в файле something.gdb, который вы используете, чтобы вытащить кучу данных, если это сделало ваш день, поговорите об этом.

  • Давайте рассмотрим условную обработку, контуры управления и функции, написанные для более элегантного и усовершенствованного программирования для отладки и, возможно, даже для тестирования whitebox
  • Интересно, когда вы начинаете отлаживать удаленные системы (скажем, через интерфейс serial/ethernet)
  • И что, если цель - это многопроцессорная (и многопоточная) система.

Позвольте мне привести простой пример в качестве примера...
Скажем,

A script, который чередуется последовательно над записями
найти плохой вход в большой хэш-таблице
который реализован на встроенной платформе.

Это помогло мне однажды отладить сломанную таблицу хэшей.

4b9b3361

Ответ 2

При отладке аварии 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

Ответ 3

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