【发布时间】:2010-09-09 16:03:28
【问题描述】:
当您在同一台计算机上对可执行文件执行常规 gdb 会话时,您可以发出运行命令,它会重新启动程序。
当您在嵌入式系统上运行 gdb 时,如使用命令 target localhost:3210,如何在不退出并重新启动 gdb 会话的情况下重新启动程序?
【问题讨论】:
当您在同一台计算机上对可执行文件执行常规 gdb 会话时,您可以发出运行命令,它会重新启动程序。
当您在嵌入式系统上运行 gdb 时,如使用命令 target localhost:3210,如何在不退出并重新启动 gdb 会话的情况下重新启动程序?
【问题讨论】:
很遗憾,我不知道如何重新启动应用程序并仍然保持会话。一种解决方法是将 PC 设置回程序的入口点。您可以通过以下方式调用:
jump <em>function</em>
或
set $pc=<em>address</em>.
如果您将参数更改为 main,您可能需要重新设置它们。
编辑:
上述方法有几个注意事项可能会导致问题。
因此,使用跳转与重新启动程序不同。
【讨论】:
大概你在嵌入式系统上运行 gdbserver。
你可以要求它重启你的程序,而不是用target extended-remote退出
【讨论】:
“跳转_start”是常用的方式。
【讨论】:
如果您正在运行常规 gdb,您可以键入“run”快捷方式“r”,gdb 会询问您是否要重新启动程序
【讨论】:
对我来说,21.2 Sample GDB session startup 中描述的方法效果很好。当我稍后在“(gdb)”提示符处输入monitor reset halt 时,目标硬件已重置,我可以使用c 重新启动应用程序(= 继续)。
在运行之间可以省略load 命令,因为不需要一次又一次地刷新程序。
【讨论】:
分步过程
远程:
# 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
传递环境变量并更改工作目录而无需重新启动:How to modify the environment variables and working directory of gdbserver --multi without restarting it?
【讨论】:
在 EFM32 Happy Gecko 上,没有任何建议对我有用,所以这是我从有关将 GDB 集成到 Eclipse 环境的文档中学到的内容。
(gdb) mon reset 0
(gdb) continue
(gdb) continue
这使我处于从 IDE 重置时所期望的状态。
【讨论】:
您可以使用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
【讨论】: