Как извлечь аргументы текущей функции в C?Linux

Ответить
Anonymous
 Как извлечь аргументы текущей функции в C?

Сообщение Anonymous »

Я пытаюсь реализовать функцию, которая извлекает стек вызовов из вызывающего объекта.
В качестве примера возьмем следующую программу:

Код: Выделить всё

// test.c
void func2(int a, double b, int* c)
{
my_backtrace_func(); // line 4
}

void func1(int a)
{
func2(5, 1.2, 0xabcd); // line 9
}

int main()
{
func1(1); // line 14
}
Как и gdb backtrace, моя функция будет печатать примерно следующее:

Код: Выделить всё

stack #1: func2 in test.c, line 4.
stack #2: func1 in test.c, line 9.
stack #3: main in test.c, line 14.
Теперь я хочу расширить его функциональность: извлечь все аргументы вызывающего объекта, как это делает gdb info args:

Код: Выделить всё

stack #1: func2 (a = 5, b = 1.2, c = 0xabcd) in test.c, line 4.
stack #2: func1 in test.c, line 9.
stack #3: main in test.c, line 14.
Предполагается, что программа скомпилирована с параметром -g на ARM64, что означает, что у меня есть доступ к разделам .debug_ и регистрам x0~x30 .
Поскольку я не опытный разработчик отладчика, я предполагаю, что мне нужен парсер карликового формата, найдите AT_DW_location аргументов в .debug_info, возможно, затем обратитесь к .debug_loc для получения списка местоположений или .eh_frame для DW_OP_call_frame_cfa .
Однако фактическое хранилище параметров можно изменить, и разные уровни компиляции, такие как -O0 и -O2, могут требовать разной обработки. Я не знаю, является ли это возможным и правильным решением.
До сих пор я не упоминал исходный код GDB. Думаю, там будет что-то значимое, но мне сложно читать.
Есть ли какой-нибудь простой и понятный способ реализовать это? как?

Подробнее здесь: https://stackoverflow.com/questions/793 ... ction-in-c
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»