Как выполнить команды точки останова GDB в пакетном режиме?
Я пытаюсь использовать gdb
неинтерактивно - т.е. печатать что-либо на каждой указанной точке останова.
$ cat script.gdb
set pagination off
catch syscall
commands
bt
c
end
# It's a hack to get backtraces only on call not on return - Linux and x86_64 specific.
# For sake of this question it can be removed, it will just output more.
condition $bpnum $rax == -38
Проблема - неинтерактивная попытка в пакетном режиме:
$ gdb /bin/true -batch -x script.gdb
Catchpoint 1 (any syscall)
Catchpoint 2 (syscall 'fork' [57])
Catchpoint 1 (call to syscall brk), 0x00007ffff7df2f9c in brk () from /lib64/ld-linux-x86-64.so.2
Однако, если бы я запустил его в интерактивном режиме:
$ gdb /bin/true -x script.gdb
GNU gdb (GDB) 8.1
...
Reading symbols from /bin/true...
(no debugging symbols found)...done.
Catchpoint 1 (any syscall)
Catchpoint 2 (syscall 'fork' [57])
(gdb) run
Starting program: /usr/bin/true
Catchpoint 1 (call to syscall brk), 0x00007ffff7df2f9c in brk () from /lib64/ld-linux-x86-64.so.2
#0 0x00007ffff7df2f9c in brk () from /lib64/ld-linux-x86-64.so.2
#1 0x00007ffff7df2488 in _dl_sysdep_start () from /lib64/ld-linux-x86-64.so.2
#2 0x00007ffff7ddcbc1 in _dl_start () from /lib64/ld-linux-x86-64.so.2
#3 0x00007ffff7ddc178 in _start () from /lib64/ld-linux-x86-64.so.2
#4 0x0000000000000001 in ?? ()
#5 0x00007fffffffe2a5 in ?? ()
#6 0x0000000000000000 in ?? ()
...
Catchpoint 1 (call to syscall exit_group), 0x00007ffff7ad7529 in _exit () from /lib64/libc.so.6
#0 0x00007ffff7ad7529 in _exit () from /lib64/libc.so.6
#1 0x00007ffff7a50a2b in __run_exit_handlers () from /lib64/libc.so.6
#2 0x00007ffff7a50ab5 in exit () from /lib64/libc.so.6
#3 0x000000000040132d in ?? ()
#4 0x00007ffff7a39c05 in __libc_start_main () from /lib64/libc.so.6
#5 0x0000000000401406 in ?? ()
[Inferior 1 (process 35434) exited normally]
(gdb) quit
Затем он работает как задумано - команды точки останова выполняются.
Добавление дополнительных -ex c
к неинтерактивной команде просто добавит еще одну строку Catchpoint 1 ...
, но до сих пор нет следа.
Справочная страница и отладка с помощью GDB не помогают.
Я предполагаю, что должна быть какая-то команда, которая просто подождет, пока она не закончится, или может быть установка где-то вроде pagination
один.
Я знаю, что я мог бы использовать что-то похожее на expect
сценарий, но я бы хотел этого избежать. Примерно так работает:
echo 'run
quit' | gdb /bin/true -x script.gdb
1 ответ
Добавление run
в конце вашего скрипта вы получите желаемый результат (по крайней мере, при использовании GNU gdb (GDB) Fedora 8.1-15.fc28
).
Примерно так работает:
эхо беги
выйти ' | gdb /bin/true -x script.gdb
Это работает или вы хотите, чтобы это работало?
quit
часть избыточна - GDB завершит работу, как только достигнет конца сценария. И echo run
часть не работает, потому что в пакетном режиме GDB не будет читать свой стандартный ввод.