你如何使用'target remote'在gdb中重新开始运行程序?

时间:2008-09-16 18:10:04

标签: embedded gdb debugging

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

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

9 个答案:

答案 0 :(得分:10)

答案 1 :(得分:6)

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

jump function

set $pc=address

如果您将参数发送到main,则可能需要重新设置它们。

编辑:

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

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

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

答案 2 :(得分:4)

据推测,您正在嵌入式系统上运行gdbserver。

您可以要求它重新启动您的计划,而不是退出target extended-remote

答案 3 :(得分:2)

“jump _start”是通常的方式。

答案 4 :(得分:2)

对我来说,21.2 Sample GDB session startup中描述的方法效果很好。当我稍后在“(gdb)”提示符处输入monitor reset halt时,目标硬件将重置,我可以使用c重新启动应用程序(=继续)。

运行之间可以省略load命令,因为不需要一次又一次地刷新程序。

答案 5 :(得分:1)

分步程序

远程:

# 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的需求,但这有以下烦恼:

传递环境变量并更改工作目录而不重启:How to modify the environment variables and working directory of gdbserver --multi without restarting it?

答案 6 :(得分:0)

如果你正在运行常规gdb,你可以输入'run'快捷键'r',gdb会询问你是否要重启程序

答案 7 :(得分:0)

在EFM32上,Happy Gecko没有任何建议对我有用,所以这里是我从关于将GDB集成到Eclipse环境的文档中学到的。

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

这使我处于从IDE进行重置时我所期望的状态。

答案 8 :(得分:0)

您可以使用 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