使用GDB调试C++;从shell脚本调用的程序 我有一个非常复杂的shell脚本,在里面调用一个C++程序,我想通过GDB调试。这是非常困难的分离这个C++程序从外壳,因为它有很多分支和许多环境变量设置。

使用GDB调试C++;从shell脚本调用的程序 我有一个非常复杂的shell脚本,在里面调用一个C++程序,我想通过GDB调试。这是非常困难的分离这个C++程序从外壳,因为它有很多分支和许多环境变量设置。,c++,debugging,shell,gdb,C++,Debugging,Shell,Gdb,有没有办法在这个shell脚本上调用GDB?看起来像 GDB < /COD>要求我直接调用C++程序。p> 您可以选择两种方式: 在shell脚本中直接调用GDB。这意味着您没有重定向标准输入和标准输出 > p>运行shell脚本,然后将调试器附加到已经运行的C++进程中,如: GDB PROCEND 1234 >代码> 1234 < /COD>是运行C++进程的进程ID。< /P> 如果您需要在程序开始运行之前执行一些操作,那么选项1将是更好的选择,否则选项2将是更干净的方法。您可以暂时


有没有办法在这个shell脚本上调用GDB?看起来像<代码> GDB < /COD>要求我直接调用C++程序。p> 您可以选择两种方式:

  • 在shell脚本中直接调用GDB。这意味着您没有重定向标准输入和标准输出

  • > p>运行shell脚本,然后将调试器附加到已经运行的C++进程中,如:<代码> GDB PROCEND 1234 >代码> 1234 < /COD>是运行C++进程的进程ID。< /P>
    如果您需要在程序开始运行之前执行一些操作,那么选项1将是更好的选择,否则选项2将是更干净的方法。

    您可以暂时将
    gdb
    添加到您的脚本中吗?

    我可能会修改脚本,使其始终调用gdb(稍后再还原),或者添加一个调用gdb的选项。这几乎总是最简单的解决方案

    下一个最简单的方法是临时移动可执行文件,并将其替换为在移动的程序上运行gdb的shell脚本。例如,在包含程序的目录中:

    $ mv program _program
    $ (echo "#!/bin/sh"; echo "exec gdb $PWD/_program") > program
    $ chmod +x program
    

    < >修改C++应用程序,打印其PID并休眠30秒(可能是基于环境或参数)。使用gdb连接到正在运行的实例。

    除了@diverscuba23提到的选项外,您还可以执行以下操作:

    gdb --args bash <script>
    
    gdb--args bash
    

    (假设它是bash脚本。否则进行相应调整)

    尽管给出的答案是有效的,但有时您没有权限更改脚本以执行gdb或修改程序以添加附加输出以通过pid附加

    幸运的是,还有另一种方法可以利用bash的强大功能

    执行pid后,使用ps、grep和awk为您选择pid。您可以用自己的脚本包装另一个脚本,也可以自己执行一个命令


    该命令可能如下所示:

    process.sh

    #!/usr/bin/env bash
    
    #setup for this example
    #this will execute vim (with cmdline options) as a child to bash
    #we will attempt to attach to this process
    vim ~/.vimrc
    
    要连接gdb,我们只需要执行以下操作:

    gdb--pid$(ps-ef | grep-ve grep | grep vim | awk'{print$2}')

  • 我在这里使用
    ps-ef
    来列出进程及其参数。有时,一个程序会运行多个实例,需要进一步grep到所需的实例
  • 之所以有
    grep-ve grep
    ,是因为ps的
    f
    选项将在其列表中包含下一个
    grep
    。如果不需要命令参数进行额外筛选,请不要为ps包含
    -f
    选项,并忽略此部分
  • grep vim
    是我们找到所需流程的地方。如果您需要更多的过滤,您可以执行类似于
    grep-E“vim.*vimrc”
    的操作,然后过滤到您正试图连接到的进程
  • awk'{print$2}'
    只将进程的pid输出到标准输出。如果您使用的是
    ps-e
    而不是
    ps-ef
  • 我的正常设置是运行这样的脚本,在1个tmux窗格中启动我的进程,并在底部窗格中键入类似于上面的内容。这样,如果我需要调整过滤(无论出于何种原因),我可以很快地完成


    通常情况下,对于一个特定的实例,它是相同的,我只想在它启动后自动附加。我将执行以下操作:

    runGdb.py

    #!/usr/bin/env bash
    
    ./process.sh &
    
    PID=$(ps -ef  | grep -ve grep | grep -E "vim.*vimrc" | awk '{print $2}')
    #or
    #PID=$(ps -e | grep vim | awk '{print $1}')
    
    gdb --pid $PID
    

    这假设原始进程可以在后台安全运行。

    Damn。。。同样的问题仍然存在。我认为我们只需要做一个简单的操作就可以得到我们感兴趣的代码…gdb从上面的方法开始,但我不能做任何事情,比如设置断点,因为它说“找不到符号表”。如何解决这个问题呢?那么您从终端发出的用gdb启动代码的命令是什么?如果它说“找不到符号表”,可能仅仅意味着您需要使用调试符号构建代码,而不是等待30秒或更好的按键时间。