Embedded 如何开始在gdb中使用'重新运行程序;目标远程';?

Embedded 如何开始在gdb中使用'重新运行程序;目标远程';?,embedded,gdb,debugging,Embedded,Gdb,Debugging,当您在同一台计算机上的一个可执行文件上执行常规gdb会话时,您可以发出run命令,它将重新启动程序 当您在嵌入式系统上运行gdb时,就像使用命令target localhost:3210一样,如何在不退出并重新启动gdb会话的情况下重新启动程序?不幸的是,我不知道如何重新启动应用程序并仍然维护会话。解决方法是将电脑设置回程序的入口点。您可以通过以下两种方式进行操作: 跳转功能 或 设置$pc=地址 如果将参数munged到main,则可能需要重新设置它们 编辑: 上述方法有几个可能导致问题的警告

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


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

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

跳转功能

设置$pc=地址

如果将参数munged到
main
,则可能需要重新设置它们

编辑:

上述方法有几个可能导致问题的警告

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

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

您可能正在嵌入式系统上运行gdbserver


你可以要求它重新启动你的程序,而不是用退出。通常的方式是“跳转启动”。

你正在寻找并且如果你运行的是普通的gdb,你可以键入“运行”快捷方式“r”,gdb会问你是否想重新启动程序。

中描述的方法对我来说非常有效。当我稍后在“(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
部分不再需要
设置远程执行文件。/myexec
,但这有以下缺点:

  • 无文件记录:
  • show args
    上不显示,并且在重新启动时不会持续:

传递环境变量并在不重新启动的情况下更改工作目录:

在EFM32 Happy Gecko上,没有任何建议适合我,因此下面是我从将GDB集成到Eclipse环境的文档中学到的内容

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

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

您可以使用
jump
gdb命令。为此,您可以检查
启动
脚本。
我的
启动脚本
有一个符号

    .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

有帮助,现在没有关于目标扩展模式。谢谢。对于一个简单的非多线程应用程序,jump正是我所需要的。