у меня получилось найти только…
cs * 10h + ip
. В твоём случае получается 48ff9
.При использовании gdb не понятно в каком конкретно месте упала программа:
#0 0x00005633bd506050 in ?? ()
Как в Release конфигурации
-g
из релизной сборки. После сборки можно скопировать получившийся ELF, отрезать от него отладочные символы и запускать его. Когда что-то упадёт, можно будет загрузить core dump с ELFом, в котором отладочные символы присутствуют, чтобы не гадать, где этот адрес. Вот как сделать дамп программы и 10 фрагментов в отдельные файлы?
Можно ли такую программу для дампов разработать самостоятельно?
Я хочу произвести отладку и остановить программу когда будет соблюдаться определенное условие. Допустим сумма регистров eax+ebx будет равна 65463.
$ cat > main.c
int v;
static void f(int *p)
{
int i;
for (i = 0; i < 20; ++i)
*p = (i - 10) * (i - 10);
}
int main()
{
f(&v);
return 0;
}
$ gcc -g2 -o watch main.c
$ gdb ./watch
...
Reading symbols from ./watch...done.
(gdb) start
Temporary breakpoint 1 at 0x4004ec: file main.c, line 13.
Starting program: /home/jcmvbkbc/tmp/toster/watch/watch
Temporary breakpoint 1, main () at main.c:13
13 f(&v);
(gdb) watch v
Hardware watchpoint 2: v
(gdb) commands
Type commands for breakpoint(s) 2, one per line.
End with a line saying just "end".
>if (v != 4)
>continue
>end
>end
(gdb) c
Continuing.
...
Hardware watchpoint 2: v
Old value = 9
New value = 4
f (p=0x600904 <v>) at main.c:7
7 for (i = 0; i < 20; ++i)
(gdb)
$ pidof top
21259
$ gdb
GNU gdb (GDB) Fedora 7.5.1-42.fc18
...
(gdb) attach 21259
Attaching to process 21259
Reading symbols from /usr/bin/top...Reading symbols from /usr/bin/top...(no debugging symbols found)...done.
...
(gdb) bt
#0 0x0000003fd2ceb843 in __select_nocancel () from /lib64/libc.so.6
#1 0x00000000004033e7 in main ()
(gdb) up
#1 0x00000000004033e7 in main ()
(gdb) x/10i $pc
=> 0x4033e7 <main+3639>: test %eax,%eax
0x4033e9 <main+3641>: jle 0x403340 <main+3472>
0x4033ef <main+3647>: xor %edi,%edi
0x4033f1 <main+3649>: callq 0x408840 <keyin>
0x4033f6 <main+3654>: cmp $0x1b,%eax
0x4033f9 <main+3657>: mov %eax,%ebx
0x4033fb <main+3659>: je 0x403340 <main+3472>
0x403401 <main+3665>: jg 0x40344e <main+3742>
0x403403 <main+3667>: test %eax,%eax
0x403405 <main+3669>: je 0x403340 <main+3472>
(gdb)
$ strace -i -p 21259
Process 21259 attached
[ 3fd2ceb843] select(1, [0], NULL, NULL, {2, 80709}) = 0 (Timeout)
...
printf.c: No such file or directory.
Смысл в том, чтобы поместить вывод программы в файл log. Такого же типа ошибка при использовании scanf.
gcc дизассемблирует файл
Можно ли, каким то способом, получить бинарный файл с отладочной информацией и отладить его?
ставить точки останова на конкретные ассемблерные команды
просматривать значения регистров