当您在同一台计算机上对可执行文件进行常规gdb会话时,可以输入run命令来重新启动程序。
当您在嵌入式系统上运行gdb时,例如使用命令target localhost:3210
,如何重新启动程序而不退出并重新启动gdb会话?
很遗憾,我不知道如何重新启动应用程序并仍然保持您的会话。一种解决方法是将PC设置回程序入口点。您可以通过调用以下任一选项来执行此操作:
jump function
或者
set $pc=address
。
如果您修改了main
函数的参数,则可能需要重新设置这些参数。
编辑:
上述方法存在一些注意事项可能会导致问题。
因此,使用jump并不等同于重新启动程序。
假设您正在嵌入式系统上运行gdbserver。
您可以使用 target extended-remote 命令要求它重新启动您的程序,而不是退出。
步骤详解
远程:
# pwd contains cross-compiled ./myexec
gdbserver --multi :1234
本地:
# pwd also contains the same cross-compiled ./myexec
gdb -ex 'target extended-remote 192.168.0.1:1234' \
-ex 'set remote exec-file ./myexec' \
--args ./myexec arg1 arg2
(gdb) r
[Inferior 1 (process 1234) exited normally]
(gdb) r
[Inferior 1 (process 1235) exited normally]
(gdb) monitor exit
在Ubuntu 14.04上进行了测试。
还可以通过以下方式将CLI参数传递给程序:
gdbserver --multi :1234 ./myexec arg1 arg2
./myexec
部分可以省略 set remote exec-file ./myexec
命令,但有以下缺点:
show args
中显示,也不会跨重启保留: https://sourceware.org/bugzilla/show_bug.cgi?id=21980在不重启的情况下传递环境变量和更改工作目录:如何修改 gdbserver --multi 的环境变量和工作目录而无需重启?
monitor reset halt
后,目标硬件将被重置,并且我可以使用c
(= continue)重新启动应用程序。load
命令。jump
gdb命令。为此,您可以检查您的startup
脚本。
我的startup script
有一个符号。 .section .text.Reset_Handler
.weak Reset_Handler
.type Reset_Handler, %function
Reset_Handler:
ldr r0, =_estack
mov sp, r0 /* set stack pointer */
jump Reset_Handler
(gdb) mon reset 0
(gdb) continue
(gdb) continue
这使我处于从IDE重置时所期望的状态。