ROS プログラムが Linux でクラッシュし、プログラム セグメント エラー プロセスが終了しました [pid 20083、終了コード -11、cmd /home GDB コア ダンプ デバッグ]

       Linuxでは、プログラムが異常終了した場合(異常シグナルSIGSEGV、SIGABRTなど)のスタック情報をコアファイルから取得できます。コア ダンプはコア ダンプと呼ばれます。プログラムの実行中に例外が発生した瞬間のメモリのスナップショットです。プログラム内で例外が発生し、その例外がプロセス内でキャプチャされなかった場合、オペレーティング システムはメモリ、レジスタ ステータス、実行中のスタックなどの情報ダンプは、コア ダンプと呼ばれるコア ファイルに保存されます。コアファイルとは、プログラムが不正に実行された後にコアダンプによって生成されるファイルで、バイナリファイルであり、gdb、elfdump、objdumpを使用して開いて解析することで、特定の内容を解析することができます。

コア ダンプの考えられる理由: (1). メモリ アクセスが範囲外です。

                                               (2). マルチスレッド プログラムはスレッドアンセーフ関数を使用します。

                                               (3). マルチスレッドによって読み書きされるデータはロックによって保護されません。

                                               (4). 不正なポインタ。

                                               (5). スタックオーバーフロー。

デバッグ手順:

1. コアダンプがオンになっているか確認し、0 が返された場合はオンになっていないことを意味し、無制限に返された場合はオンになったことを意味します。

ulimit -c

2. コアダンプがオンになっていない場合

ulimit -c unlimited

このコマンド行を実行した後は、現在の端末に対してのみ有効になります。

すべての端末に対して有効にしたい場合は、次のようにこのコード行を .bashrc の最後に追加します。

3. 実行可能ファイルを生成するには、-g オプションを追加して特定の行番号情報を取得する必要があります。そうしないと、

g++ -g -o main main.c

4. プログラムを実行すると、デフォルトでは実行ファイルと同じディレクトリにコアファイルが生成され、ファイル名は core に固定されます。

./main

次のコマンドを実行して、ファイル名を core.pid などの形式に変更します。ここで、pid は現在のプログラムを実行しているプロセス番号であり、core_uses_pid の元の内容は 0 です。 

echo "1" > /proc/sys/kernel/core_uses_pid

引用 1引用 2

5. gdb を使用してコアをデバッグする

gdb main core

6. プログラムスタック情報の表示

bt

小さなテスト:

#include "stdio.h"
 
int main(){
	int *b = 0;
	*b = 10;
	printf("******** b = %d ************ ",*b);
}

コアファイルが生成される

プログラム エラーは 5 行目に示されています。 

参考

ros で分析用のクラッシュ ファイルを生成する方法: 

1. コアダンプがオンになっているかどうかを確認します

2. 次に、roslaun または rosun を直接実行してノードを実行し、クラッシュ ファイルを生成します。roslaunch 中にコア ダンプ ファイルが生成される場所は $ROS_HOME の下にあります。設定されていない場合、デフォルトでは ~/.ros ディレクトリにあります。

        注: 実行可能ファイルまたはライブラリをコンパイルおよび生成するときは、デバッグ オプションをオンにする必要があります。オンにしないと、gdb デバッグ情報がなくなり、ソース コードを表示したり、ブレークポイントを設定したりできなくなります

        単一ファイルの直接コンパイル: -g オプションを追加するだけです
g++ -g -o main main.c
        プロジェクトのコンパイル: 

                コマンドラインモード:

catkin_make -DCMAKE_BUILD_TYPE=Debug

                CMakelist.txt ファイルを変更します。

SET(CMAKE_BUILD_TYPE "Debug")
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

3. gdb でコア ダンプ ファイルを確認します (-q: GDB によって出力される免責事項をシールドすることを意味します)

gdb main core -q

 参考

おすすめ

転載: blog.csdn.net/qq_34761779/article/details/131578480