コアダンプを生成するためのLinuxの方法と設定

元のアドレス:https//www.cnblogs.com/flyinggod/p/13415862.html

関連記事

1.コアファイルの機能、設定、使用法---- https://www.cnblogs.com/xiaodoujiaohome/p/6222895.html

2.Linuxシステム設定ulimitとコアファイルの生成-https://blog.csdn.net/zjb9605025/article/details/6553184

 

1

2

3

4

5

6

7

8

9

10

core dump 定义

A core dump is the recorded state of the working memory of a computer program at a specific time, generally when the

program has terminated abnormally (crashed). In practice, other key pieces of program state are usually dumped at

the same time, including the processor registers, which may include the program counter and stack pointer, memory

management information, and other processor and operating system flags and information. The name comes from the

once-standard memory technology core memory. Core dumps are often used to diagnose or debug errors in computer programs.

 

On many operating systems, a fatal error in a program automatically triggers a core dump, and by extension the phrase

"to dump core" has come to mean, in many cases, any fatal error, regardless of whether a record of the program memory

is created.

コアダンプの生成方法

Linux環境では、例外が原因でプロセスがハングし、通常は原因を特定するのが困難ですが、Linuxカーネルが提供するコアファイルは、通常、クラッシュ時にプロセスの情報を記録します。ただし、コアファイルを生成するにはスイッチを設定する必要があります。具体的な手順は次のとおりです。

1.コアファイルを生成するためのスイッチがオンになっているかどうかを確認し、コマンドを入力します

ulimit -a

最初の行のコアファイルサイズは0であり、有効になっていません。

2. ulimit -c [kbytes]を使用して、システムで許可されるコアファイルサイズを設定します。

1

2

3

ulimit -c 0              #不产生core文件

ulimit -c 100            #设置core文件最大为100k

ulimit -c unlimited      #不限制core文件大小   

コマンドulimit-c limitlimitedを実行してから、ulimit-aを実行してコアを表示します

 このように、プロセスがクラッシュしたときにコアファイルを生成できます。このメソッドはシェルでのみ有効になります。この設定が常に有効な場合は、次の設定を行う必要があります。

1

2

vim /etc/profile                                   #然后进入编辑模式,在profile文件中加入

ulimit -c unlimited

 保存して終了し、サーバーを再起動すると、変更されたファイルが長期間有効になります。または

ソース/ etc / profile

サーバーを再起動せず、ソースを使用してファイルをすぐに有効にします。

3.生成されたファイルのパスと名前を指定します

デフォルトでは、コアダンプによって生成されるファイル名はcoreであり、プログラムの現在のディレクトリにあります。新しいコアは既存のコアを上書きします。/proc/sys/kernel/core_uses_pidファイルを変更することで、コアファイルの保存場所とファイル形式を制御できます。

vim /etc/sysctl.conf#編集モードに入り、次の2行を追加します

kernel.core_pattern = / tmp / corefile / core_%t_%e_%p 
kernel.core_uses_pid = 0

varの下にコアディレクトリを作成し、

sysctl –p /etc/sysctl.conf

変更はすぐに有効になります。

core_patternの名前付きパラメーターは次のとおりです。

コードをコピーする

%cダンプファイルサイズの上限
%eダンプされたファイル名
%gダンプされたプロセスの実際のグループID 
%hホスト名
%pダンプされたプロセスPID 
%sこのコアダンプの原因となったシグナル
%tダンプ時間( 1970年1月1日からの秒数)
%uダンプされたプロセスの実際のユーザーID

コードをコピーする

4.ターミナルでコマンドkill-s SIGSEGV $$を実行すると、コアファイルが/ tmp / corefileの下に生成され、設定が成功したことがわかります。

コアファイルは、次の条件下では生成されません。

1

2

3

4

进程是设置- 用户-ID ,而且当前用户并非程序文件的所有者;

进程是设置- 组-ID ,而且当前用户并非该程序文件的组所有者;

用户没有写当前工作目录的许可权;

文件太大。core 文件的许可权( 假定该文件在此之前并不存在) 通常是用户读/ 写,组读和其他读。

コアダンプ生成の原理

コアダンプは通常、プロセスが特定のシグナルを受信したときに発生します。現在、Linuxには60を超えるシグナルがあります。kill-lコマンドを使用して、それらすべてを一覧表示できます。

特定の信号について、アプリケーションは対応する信号処理関数を書き込むことができます。指定しない場合、デフォルトの処理方法が採用されます。デフォルトの処理は、次のようなコアダンプのシグナルです。

1

2

3)SIGQUIT   4)SIGILL    6)SIGABRT   8)SIGFPE    11)SIGSEGV    7)SIGBUS    31)SIGSYS

5)SIGTRAP   24)SIGXCPU  25)SIGXFSZ  29)SIGIOT

SIGSEGVが含まれていることがわかります。通常、この信号は、配列が範囲外の場合、またはnullポインターにアクセスした場合に生成されます。さらに、これがデフォルトですが、独自の信号処理関数を記述してデフォルトの動作を変更することもできます。Googleで信号関連の詳細を確認することもできます。

コアダンプファイルのデバッグ

1

2

3

4

5

6

7

8

9

10

11

12

#include <stdio.h>

  

int func(int *p)

{

        *p = 0;

}

  

int main()

{

        func(NULL);

        return 0;

}

上記のコードは、コアダンプを生成するサンプルコードです。

 このとき、この実行可能プログラムの下に新しいコアファイルが生成されます

プロセスがクラッシュした場所を確認する

クラッシュのラインを見つけます

コンパイル時に-gデバッグスイッチをオンにできます

1

gcc main.c -g -o a.c

coredumグローバルモードを設定したくない場合は、現在のプロセスのクラッシュ場所を特定できるコアファイルを生成するだけで済みます。必要な操作は4つだけです。

1

2

3

4

ulimit -c unlimited

echo "/tmp/core-%e-%p" > /proc/sys/kernel/core_pattern

gcc -o main -g a.c

gdb main /tmp/core-main-10815

上記のプログラムをコンパイルするときに注意することの1つは、生成された実行可能プログラムが十分なデバッグ情報をもたらすように、パラメーター-gを持ってくる必要があります。コンパイルして実行すると、待望の「Segment Fault(コアダンプ)」または「SegmentFault(コアダンプ)」という単語が表示されるはずです。現在のディレクトリにcoreまたはcore.xxxファイルがあるかどうかを確認します。LinuxでクラシックデバッガGDBを使用し、最初にコアファイルgdb exefile coreをプログラムにロードします。ここでは、コアファイルがexefileによって生成される必要があることに注意する必要があります。そうしないと、シンボルテーブルがアップロードされません。ロード後はこんな感じ

1

2

3

4

5

6

sagi@sagi-laptop:~$ gdb coredump core

Core was generated by ./coredump'.

    Program terminated with signal 11, Segmentation fault.

#0  0x080483a7 in crash () at coredump.c:8

    8       xxx[1] = 'D';

(gdb)

コアを直接見つけて、8行目に読み取り専用メモリ領域を書き込むことができることがわかります。これにより、SegmentFault信号がトリガーされます。コアをロードする際のちょっとしたコツがあります。どのプログラムがコアファイルを生成したかが事前にわからない場合は、それを置き換えるプログラムを見つけることができます。たとえば、/ usr / bin / wが適切です。たとえば、このメソッドを使用して上記で生成されたコアをロードすると、gdbは同様の出力を持ちます

1

2

3

4

5

sagi@sagi-laptop:~$ gdb /usr/bin/w core

Core was generated by ./coredump'.

    Program terminated with signal 11, Segmentation fault.

#0  0x080483a7 in ?? ()

    (gdb)

GDBは、どのプログラムがこのコアを生成したかをすでに通知していることがわかります。

GDBの一般的な操作

上記のプログラムは比較的単純であり、問​​題は追加の操作なしで直接見つけることができます。これは実際には当てはまりません。問題をスムーズに特定するために、シングルステップトラッキング、ブレークポイントの設定、およびその他の操作を実行する必要がある場合がよくあります。GDBの一般的な操作のいくつかを以下に示します。

1

2

3

4

5

6

7

8

9

10

11

12

13

启动程序:run

设置断点:b 行号|函数名

删除断点:delete 断点编号

禁用断点:disable 断点编号

启用断点:enable 断点编号

单步跟踪:next 也可以简写 n

单步跟踪:step 也可以简写 s

打印变量:print 变量名字

设置变量:set var=value

查看变量类型:ptype var

顺序执行到结束:cont

顺序执行到某一行: util lineno

打印堆栈信息:bt

 

 

おすすめ

転載: blog.csdn.net/xqhrs232/article/details/113557757