В качестве примера возьмем следующую программу:
Код: Выделить всё
// 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
}
Код: Выделить всё
stack #1: func2 in test.c, line 4.
stack #2: func1 in test.c, line 9.
stack #3: main in test.c, line 14.
Код: Выделить всё
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.
Поскольку я не опытный разработчик отладчика, я предполагаю, что мне нужен парсер карликового формата, найдите 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
Мобильная версия