【问题标题】:How do you start running the program over again in gdb with 'target remote'?您如何使用“目标远程”在 gdb 中重新开始运行程序?
【发布时间】:2010-09-09 16:03:28
【问题描述】:

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

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

【问题讨论】:

    标签: embedded gdb debugging


    【解决方案1】:

    很遗憾,我不知道如何重新启动应用程序并仍然保持会话。一种解决方法是将 PC 设置回程序的入口点。您可以通过以下方式调用:

    jump <em>function</em>

    set $pc=<em>address</em>.

    如果您将参数更改为 main,您可能需要重新设置它们。

    编辑:

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

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

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

    【讨论】:

    • 对于一个简单的非多线程应用,跳转正是我所需要的。
    【解决方案2】:

    大概你在嵌入式系统上运行 gdbserver。

    你可以要求它重启你的程序,而不是用target extended-remote退出

    【讨论】:

    • 有帮助,现在不涉及目标扩展模式。谢谢。
    【解决方案3】:

    “跳转_start”是常用的方式。

    【讨论】:

      【解决方案4】:
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

          分步过程

          远程:

          # 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?

          【讨论】:

            【解决方案8】:

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

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

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

            【讨论】:

              【解决方案9】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2014-12-15
                • 1970-01-01
                • 2014-10-06
                • 2011-09-26
                • 2016-11-23
                • 2011-08-05
                • 1970-01-01
                • 2012-02-24
                相关资源
                最近更新 更多