当您在同一台计算机上的可执行文件上执行常规 gdb 会话时,您可以发出 run 命令,它将再次启动程序。

当您在嵌入式系统上运行 gdb 时,就像使用命令 target localhost:3210' 一样,如何在不退出并重新启动 gdb 会话的情况下重新启动该程序?

有帮助吗?

其他提示

不幸的是,我不知道如何重新启动应用程序并仍然保持会话。解决方法是将 PC 设置回程序的入口点。您可以通过调用以下任一方法来执行此操作:

jump 功能

或者

set $pc=地址.

如果你把论点混为一谈 main 您可能需要重新设置它们。

编辑:

上述方法有一些注意事项可能会导致问题。

  • 如果您在多线程程序中跳转到main,则会将当前线程跳转到main,所有其他线程保持不变。如果当前线程持有锁......那么你就会遇到一些问题。
  • 内存泄漏,如果您的程序流在初始化期间分配了一些东西,那么您只是在跳转时泄漏了一堆内存。
  • 打开的文件仍将保持打开状态。如果您映射某些文件或地址,调用很可能会失败。

因此,使用跳转与重新启动程序不同。

假设您正在嵌入式系统上运行 gdbserver。

您可以要求它重新启动您的程序而不是退出 目标扩展远程

“jump_start”是通常的方式。

对我来说,中描述的方法 21.2 GDB 会话启动示例 效果很好。当我进入 monitor reset halt 稍后在“(gdb)”提示符处目标硬件被重置,我可以使用以下命令重新启动应用程序 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, ,但这有以下烦恼:

传递环境变量并更改工作目录而无需重新启动: 如何在不重启的情况下修改gdbserver --multi的环境变量和工作目录?

如果您正在运行常规 gdb,您可以输入“运行”快捷方式“r”,gdb 会询问您是否要重新启动程序

在 EFM32 Happy Gecko 上,所有建议都不适合我,因此以下是我从有关将 GDB 集成到 Eclipse 环境的文档中学到的内容。

(gdb) mon reset 0
(gdb) continue
(gdb) continue

这使我处于从 IDE 中点击重置时所期望的状态。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top