Linux では、コアとはメモリを意味します。プログラムの実行中に例外が検出され、プログラムが異常終了すると、システムはプログラムの現在のメモリ状態をコア ダンプと呼ばれるコア ファイルに保存します。これは情報ダンプでもあり、オペレーティング システムが例外を検出すると、コア ダンプと呼ばれます。現在のプロセスでは、シグナルを使用します。ターゲット プロセスに、対応するエラー情報を通知します。一般的なシグナルには、SIGSEGV、SIGBUS などが含まれます。デフォルトでは、プロセスは、対応するシグナルを受信したときに、対応する処理メカニズムを備えています。
#このチュートリアルの動作環境: linux7.3 システム、Dell G3 コンピューター。
Linux で開発している場合、プログラムのコアが落ちたというプログラマの声をよく聞きます。通常、このような問題は、境界外のメモリ アクセス、null ポインタの使用、スタックなどの低レベルのバグが原因で発生します。オーバーフローなどプログラムが実行中に終了または異常終了した場合、これらの条件が満たされたときにコア ファイルが生成されます。
なぜコアダンプが起こるのか
コアとはメモリを意味し、この言葉は昔からメモリを作るために使われていた材料に由来しており、古くから使われてきました。プログラムの実行中に例外が検出され、プログラムが異常終了すると、システムはプログラムの現在のメモリ状態をコア ダンプと呼ばれるコア ファイルに保存します。このファイルは、情報ダンプとも呼ばれます。オペレーティング システムは現在のプロセスを検出し、プロセスが異常である場合、ターゲット プロセスにシグナルを通じて対応するエラー情報を通知します。一般的なシグナルには SIGSEGV、SIGBUS などが含まれます。デフォルトでは、プロセスには対応するシグナルを受信するための対応する処理メカニズムがあります。
Linux を例にとると、Action が信号処理方式に相当し、赤枠が共通信号としてマークされています
です。プロセスのメモリ レイアウトに関しては、Unix と Linux システムのプロセス空間レイアウトは若干異なります。カーネル空間は Linux よりも小さく、特にカーネル プロセスとユーザー プロセスは個別のアドレス空間モードを採用しています。 Linux の例を次に示します。
コアダンプ ファイルの保存場所
Linux では、これがわかっています。システムでは、プロセスがクラッシュすると、システム カーネルがプロセス クラッシュ情報をキャプチャし、プロセスのコアダンプ情報をファイルに書き込みます。ファイル名のデフォルトは core です。保存場所は、対応する実行可能プログラムと同じディレクトリにあります。ファイル名は core です。コア ファイルの場所は、次のコマンドで確認できます:
Core_pattern の形式:
%p ダンプ プロセスの PID
%u (数値) ダンプ プロセスの実際の UID
%G (数値) ) dump プロセスの実際の GID
%s ダンプの原因となったシグナルの数
%t 1970 年 1 月 1 日 00:00:00 0000 (UTC) からの秒数で表されるダンプ時間
% H ホスト名 (uname(2) によって返されるノード名と同じ)
%e 実行可能ファイル名 (パス接頭辞なし)
%E 実行可能ファイルのパス名。スラッシュ (' で置き換えられます) /') は感嘆符 ('!') です。
%C クラッシュ プロセスのコア ファイル サイズのソフト リソース制限 (Linux 2.6.24 以降)
次のプログラムを使用して、/proc/sys/kernel/ のパイプ構文をデモンストレーションできます。 core_pattern ファイルの使用法。
注意一下: 这里是指在进程当前工作目录的下创建。通常与程序在相同的路径下。但如果程序中调用了chdir函数,则有可能改变了当前工作目录。这时core文件创建在chdir指定的路径下。有好多程序崩溃了,我们却找不到core文件放在什么位置。和chdir函数就有关系。当然程序崩溃了不一定都产生 core文件。
下面通过的命令可以更改coredump文件的存储位置,如下:
echo “|$PWD/core_pattern_pipe_test %p UID=%u GID=%g sig=%s” > /proc/sys/kernel/core_pattern
cat /proc/sys/kernel/core_pattern
查看路径已经变为如下:
下面带大家配置永久的core。只要出现内存访问越界、使用空指针、堆栈溢出等情况,都可以在这个目录下查看。
配置 core
1、首先在根目录下建立一个储存coredump文件的文件夹,命令如下:
mkdir /corefile
2、设置产生coredump文件的大小,命令如下:
ulimit -c unlimited
3、 执行以下两条命令:
echo “1” > /proc/sys/kernel/core_uses_pid //将1写入到该文件里 echo “/corefile/core-%e-%p-%t” > /proc/sys/kernel/core_pattern
将coredump产生的格式制定好写入core_pattern文件,这样当coredump产生时会直接以这种格式存入到根目录下的文件夹corefile中。
4、修改配置文件/etc/profile
vim /etc/profile
添加 ulimit -S -c unlimited > /dev/null 2>&1
执行命令生效该文件
5、 在配置文件/etc/rc.local中最后面添加信息(机器重启时会自动加载该命令):添加命令:
rm -rf /corefile/*
机器重启时清空该文件夹,由于产生的coredump文件很大,若不清空的话时间长了会将硬盘占满;
再执行以下两条命令:
echo “1” > /proc/sys/kernel/core_uses_pid echo “/corefile/core-%e-%p-%t” > /proc/sys/kernel/core_pattern
测试
下面写个例子测试一下是否配置好了corefile文件
#include
编译运行,注意这里需要-g选项编译。
进入前面创建的corefile文件夹:
出现core文件表示完成coredump配置。可以用通过readelf命令进行判断是否是core文件:
gdb を実行してコア ファイルを読み取ります。コマンドは「gdb プログラムはコアダンプ ファイルに対応します」です。このとき、gdb プロンプトは「(gdb)」と入力します。
#赤いボックスのスクリーンショットからわかるように、プログラムはシグナル 11 により終了します。
bt(backtrace) コマンド (またはどこ) を通じて関数の呼び出しスタックを確認できます。
つまり、test.cpp の 6 行目までプログラムを実行するとセグメンテーション違反が発生します。その理由は、null ポインターを指しているためです。
概要
プログラム コアダンプの原因は数多くありますが、主に境界外のメモリ アクセス、スレッドアンセーフの使用などの概要を示します。関数、null ポインターの使用、スタック オーバーフローなど。
ここで言いたいのは、gdb でコアダンプをデバッグする場合、ほとんどの場合、コア ファイルからそのコアの直感的な理由しか見つけられないが、より根本的な理由は一般に次のとおりである必要があるということです。コードと組み合わせて、その時点でのプロセスの実行を分析するため、コンテキストに応じたシナリオを通じてのみ、プログラム コードのどこに問題があるかを推測できます。
関連する推奨事項: 「Linux ビデオ チュートリアル 」
以上がLinuxコアとはどういう意味ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。