LINUX.ORG.RU

трассировать все вызовы call и регистры

 , ,


0

5

для целей анализа программы без исходных кодом хочу вывести на экран все её вызовы call (E8) и некоторые регистры
т.е. вывод строки должен быть вида: $addr $rax $rbx $rcx
где addr - вызываемый адрес, далее значения регистров
чем такое можно (ли) сделать ?

★★★★★

gdb должен с этим справится, даже собранный без debug информации, он будет деассмблировать надо только выдать нужный layout. Кроме того есть strace - тоже может пригодится

Silerus ★★★★
()

так что ли?

dron@gnu:~$ cat test.c 
#include <stdio.h>

char * function_name()
{
    return "hello";
}


int main(int argc, char *argv[])
{
    
    printf("%s\n",function_name() );
    return 0;
}
dron@gnu:~$ gcc -g test.c 
dron@gnu:~$ objdump -D ./a.out | grep call
 4d0:	e8 0f 20 00 00       	callq  24e4 <__FRAME_END__+0x1bfc>
 540:	ff d0                	callq  *%rax
 5a4:	ff 15 2e 0a 20 00    	callq  *0x200a2e(%rip)        # 200fd8 <__libc_start_main@GLIBC_2.2.5>
 65e:	e8 0d ff ff ff       	callq  570 <.plt.got>
 663:	e8 48 ff ff ff       	callq  5b0 <deregister_tm_clones>
 6a8:	ff d0                	callq  *%rax
 6d1:	e8 da ff ff ff       	callq  6b0 <function_name>
 6d9:	e8 82 fe ff ff       	callq  560 <puts@plt>
 71c:	e8 0f fe ff ff       	callq  530 <_init>
 739:	41 ff 14 dc          	callq  *(%r12,%rbx,8)
 79b:	ff 5c 00 00          	lcall  *0x0(%rax,%rax,1)
 7bb:	ff 54 01 00          	callq  *0x0(%rcx,%rax,1)
 2f4:	e8 02 00 00 10       	callq  100002fb <_end+0xfdff2c3>
dron@gnu:~$ 

Deleted
()
Ответ на: комментарий от Deleted

по шагам мне не нужно, тысячи call не обработать
нужна автоматизация - запустил и на выходе нужный мне формат
а далее grep мне поможет

x905 ★★★★★
() автор топика
Ответ на: комментарий от x905

нужна автоматизация - запустил и на выходе нужный мне формат

objdump и подобное, больше никак наверное.

Deleted
()
Ответ на: комментарий от x905

никак, objdump не запускает твою программу

anonymous
()
Ответ на: комментарий от vvvvvvvv

perf может и регистры показать ?
насколько я его понял он «событийный»

x905 ★★★★★
() автор топика
Ответ на: комментарий от vvvvvvvv

Intel SDE

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

x905 ★★★★★
() автор топика
Ответ на: комментарий от xaizek

надо поизучать, не писал ранее на питоне для gdb

x905 ★★★★★
() автор топика

qemu вроде как умеет трейсить

anonymous
()
Ответ на: комментарий от xaizek

наверно мне подойдет останов(трейс) каждой инструкции и вывод её и нужных регистров
нашел, что вывод инструкции это display/i $pc
но как сюда же добавить парочку регистров и чтобы было все в одну строку ?
типа:

=> 0x7ffff7dee88f <_dl_runtime_resolve_avx+31>: mov %rdx,0x150(%rsp) MYREGS=«0x1 0x2 0x3»

x905 ★★★★★
() автор топика
Ответ на: комментарий от x905

Можно printf использовать:

(gdb) printf "%p; rax = 0x%016x\n", $pc, $rax
0x49b72c; rax = 0x000000000049b71d

xaizek ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.