2017-02-14 181 views
0

我有一個小型的C++程序my-program。當我直接運行my-programC++:在linux shell腳本中運行gdb

./my-program arg1 

一切正常。我沒有得到任何錯誤。此外,我有my-script.sh

#!/bin/sh 
my-program $1 

當我直接運行此腳本:

./my-script.sh arg1 

我沒有得到任何錯誤。

從其他linux進程運行my-script.sh時出現此問題。在這種情況下,我有時(!)得到Segmentation fault錯誤。我做了什麼:我加入了-g切換到C++編譯器和編輯my-script.sh,所以就成了:

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

gdb-script我寫道:

run 

但是,我仍然無法找到線,導致Segmentation fault錯誤。如何在出錯後讓dgb將堆棧跟蹤打印到某個文件?或者也許有辦法讓程序中導致這個錯誤的地方?

+1

將'bt'(或'backtrace'或'where')添加到您的「gdb-script」文件中? - 如果你有很多線程,你可能想要做更多的事情來打印所有線程的所有堆棧 - 我不確定那個命令是什麼,但我知道它可以完成。 –

+0

嘗試在valgrind下運行。 –

回答

1

從其他linux進程運行my-script.sh時出現問題。

你的腳本包含幾個錯誤:

  1. 如果在my-program所在的目錄是在你的$PATH它只會工作。

  2. 它沒有正確地將參數傳遞給my-program。特別是,只傳遞第一個參數,如果該參數包含空格,則它將被分割爲單詞,並在調用時間爲my-program時變爲多個參數。

爲了解決這個問題,這樣做:

#!/bin/sh 
exec $(dirname "$0")/my-program "[email protected]" 

我怎樣才能讓DGB打印堆棧跟蹤到錯誤後,某些文件?

附加where命令到gdb-script

1

您可以檢查,如果你有一些核心轉儲限制在您的系統設置:

ulimit -c 

如果是「0」,你不會得到任何產生核心轉儲。 集:

ulimit -c unlimited 

然後只要你「分段故障」運行程序。然後你應該生成核心轉儲文件。