Я хочу получить вывод, похожий на backtrace
, как это делает gdb. Но я хочу сделать это напрямую через ptrace()
. Моя платформа — Linux, x86; а позже x86_64.
Теперь я хочу только читать адреса возврата из стека, без преобразования в имена символов.
Итак, для тестовой программы, скомпилированной в режиме -O0
автором gcc-4.5
:
int g() {
kill(getpid(),SIGALRM);
}
int f() {
int a;
int b;
a = g();
b = a;
return a+b;
}
int e() {
int c;
c = f();
}
main() {
return e();
}
Я запущу свою программу и свяжусь с ptrace
для тестирования программы в самом начале. Затем я сделаю PTRACE_CONT и буду ждать сигнала. Когда тестовая программа выполнит самоуничтожение; сигнал будет доставлен в мою программу. В этот момент я хочу прочитать обратные адреса, они будут такими (потому что функция kill
в данный момент активна):
0x00_some_address_in_g
0x00_some_address_in_f
0x00_some_address_in_e
0x00_some_address_in_main
0x00_some_address_in__libc_start_main
Как я могу найти адреса возврата текущего остановленного тестового процесса с помощью ptrace
? Будет ли петля по кадрам? Когда я должен остановить такой цикл?
PS: да, это тоже очень похоже на backtrace(3)
libc function в идее, но я хочу сделать это извне через ptrace.