使用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> 您可以选择两种方式:
如果您需要在程序开始运行之前执行一些操作,那么选项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
通常情况下,对于一个特定的实例,它是相同的,我只想在它启动后自动附加。我将执行以下操作: 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秒或更好的按键时间。