【问题标题】:C++: running gdb in linux shell scriptC++:在 linux shell 脚本中运行 gdb
【发布时间】:2017-02-14 07:19:49
【问题描述】:

我有一个小型 C++ 程序 my-program。当我直接运行my-program

./my-program arg1

一切正常。我没有收到任何错误。另外我还有my-script.sh:

#!/bin/sh
my-program $1

当我直接运行这个脚本时:

./my-script.sh arg1

我没有收到任何错误。

my-script.sh 从其他 linux 进程运行时出现问题。在这种情况下,我有时(!)得到Segmentation fault 错误。我做了什么:我将-g切换到c++编译器并编辑my-script.sh,所以它变成了:

#!/bin/sh
gdb -batch -x gdb-script --args my-program $1

gdb-script我写道:

run

但是,我仍然找不到导致Segmentation fault 错误的行。错误后如何让 dgb 将堆栈跟踪打印到某个文件?或者也许有办法在程序中获取导致此错误的位置?

【问题讨论】:

  • bt(或backtracewhere)添加到您的“gdb-script”文件中? - 如果你有很多线程,你可能想要做更多的事情来打印所有线程的所有堆栈 - 我不确定那个命令是什么,但我知道它可以完成。
  • 尝试在 valgrind 下运行。

标签: c++ linux bash shell gdb


【解决方案1】:

从其他linux进程运行my-script.sh时出现问题。

您的脚本包含几个错误:

  1. 仅当my-program 所在的目录在您的$PATH 上时才有效。

  2. 它没有正确地将参数传递给my-program。特别是,仅传递第一个参数,如果该参数包含空格,它将被拆分为单词,并在调用my-program 时成为多个参数。

要解决此问题,请执行以下操作:

#!/bin/sh
exec $(dirname "$0")/my-program "$@"

如何让 dgb 在出错后将堆栈跟踪打印到某个文件?

where 命令附加到gdb-script

【讨论】:

    【解决方案2】:

    您可以检查您的系统中是否对核心转储设置了一些限制:

    ulimit -c
    

    如果为“0”,则不会生成任何核心转储。 设置:

    ulimit -c unlimited
    

    然后只要你得到“分段错误”就运行程序。然后你应该生成核心转储文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-24
      • 1970-01-01
      • 2014-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多