Вернуть значение с помощью пользовательской команды GDB

Я отлаживаю с помощью core-файла, поэтому у меня нет активного процесса, в котором можно что-либо запустить.

Я использую пользовательские команды GDB для проверки набора данных из файла ядра и пытаюсь упростить процесс с помощью пользовательских команд.

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

Например:
(обратите внимание на комментарий в строке "возврат")

define dump_linked_list
    set $node = global_list->head
    set $count = 1
    while $node != 0
        printf "%p -->", $node
        set $node = $node->next
        set $count = $count + 1
    end
    return $count  ## GDB doesn't understand this return
end

В идеале моя команда dump_linked_list должна возвращать количество узлов, найденных в списке, чтобы ее можно было использовать в другой определенной команде:

define higher_function
    set $total_nodes = dump_linked_list
    printf "Total Nodes is %d\n", $total_nodes
end

Это возможно в командах GDB?

Я чувствую, что это должно быть, но я искал документацию и не могу найти упоминания об этом или каких-либо примеров.

2 ответа

Решение

Насколько я знаю, GDB не имеет такой функциональности. Вы можете установить переменную с некоторым именем, которое вы знаете, и использовать ее как "возвращаемое" значение. Например, всегда устанавливайте переменную retval следующим образом:

set $retval = <whatever value>

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

Я обнаружил, что GDB, кажется, передается по имени, которое можно использовать для возврата возвращаемого значения. Немного более гибкий, чем просто использование одной глобальной переменной.

(gdb) define foo
Type commands for definition of "foo".
End with a line saying just "end".
>set $arg0 = 1
>end
(gdb) set $retval = 0
(gdb) p $retval
$3 = 0
(gdb) foo $retval
(gdb) p $retval
$4 = 1
Другие вопросы по тегам