当您在同一台计算机上对可执行文件执行常规 gdb 会话时,您可以发出 run 命令,它将重新启动程序。
当您在嵌入式系统上运行 gdb 时,与 command 一样target localhost:3210
,如何在不退出并重新启动 gdb 会话的情况下重新启动程序?
不幸的是,我不知道如何重新启动应用程序并仍然保持您的会话。一种解决方法是将 PC 设置回程序的入口点。您可以通过以下任一方式调用:
jump function
或者
set $pc=address
.
如果您将论点转换为main
您可能需要再次设置它们。
编辑:
上述方法有几个注意事项可能会导致问题。
因此,使用跳转与重新启动程序不同。
大概您正在嵌入式系统上运行 gdbserver。
您可以要求它重新启动程序,而不是使用目标扩展远程退出
“跳转_start”是通常的方式。
分步程序
偏僻的:
# 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 的环境变量和工作目录?
如果您正在运行常规 gdb,您可以键入“run”快捷方式“r”,gdb 会询问您是否要重新启动程序
对我来说,21.2 示例 GDB 会话启动中描述的方法效果很好。当我稍后在“(gdb)”提示符处输入时,目标硬件已重置,我可以使用(=继续)monitor reset halt
重新启动应用程序。c
在运行之间可以省略该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
在 EFM32 Happy Gecko 上,没有任何建议对我有用,所以这是我从有关将 GDB 集成到 Eclipse 环境的文档中学到的内容。
(gdb) mon reset 0
(gdb) continue
(gdb) continue
这使我处于从 IDE 重置时所期望的状态。