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