コアダンプの導入と使用

目次

1 コアダンプとは

2 コアダンプ機能を有効にする方法

2.1 コア ファイルのサイズを設定する方法:

2.2 コア ファイルのパスを設定する

3 コアダンプにはいくつかの状況があります

3.1 範囲外のメモリアクセス

3.2 マルチスレッド プログラムで、スレッドセーフでない関数が使用されている。

3.3 複数のスレッドによって読み書きされるデータは、ロックによって保護されません。

3.4 不正なポインタ

3.5 スタック オーバーフロー

4例


1 コアダンプとは

コアダンプは、プログラムがクラッシュしたときに取得されるメモリ スナップショットです。

プログラムで例外が発生し、例外がプロセス内でキャッチされない場合、オペレーティング システムは、その時点でのプロセスのメモリ、レジスタ ステータス、実行中のスタックなどの情報をダンプしてファイルに保存します。

2 コアダンプ機能を有効にする方法

ulimit -c は、コア ファイルのサイズを設定できます。値が 0 の場合、コア ファイルは生成されません。値が小さすぎる場合、コア ファイルは生成されません。コア ファイルは一般に比較的大きいためです。

2.1 コア ファイルのサイズを設定する方法:

1、ulimit -c 無制限

一時的に有効

2、/etc/security/limits.conf

・ソフトコア無制限

*ハードコア無制限

永続

3、/etc/プロフィール

ulimit -c 無制限

永続

2.2 コア ファイルのパスを設定する

/var/crash/coredump.%e.%p を /proc/sys/kernel/core_pattern ファイルに追加して、コアダンプ ファイルを /var/crash に生成できるようにします。

3 コアダンプにはいくつかの状況があります

3.1 範囲外のメモリアクセス

a) 間違った添字を使用したため、配列アクセスが範囲外です。

 b) 文字列を検索するとき、文字列が終了しているかどうかを判断するために文字列の末尾に依存しますが、文字列は通常の文字の末尾を使用しません。

 c) strcpy、strcat、sprintf、strcmp、strcasecmp およびその他の文字列操作関数を使用して、ターゲット文字列を読み書きします。範囲外の読み書きを防ぐには、strncpy、strlcpy、strncat、strlcat、snprintf、strncmp、strncasecmp などの関数を使用する必要があります。

3.2 マルチスレッド プログラムで、スレッドセーフでない関数が使用されている。

再入可能関数を使用する必要があります。

3.3 複数のスレッドによって読み書きされるデータは、ロックによって保護されません。

複数のスレッドが同時にアクセスするグローバル データの場合は、ロック保護に注意する必要があります。そうしないと、簡単にコアダンプが発生します。

3.4 不正なポインタ

a)ヌルポインタを使用する

b) ポインター変換を自由に使用してください。メモリの一部へのポインタ。ただし、このメモリの一部が最初に特定の構造体または型、またはこの構造体または型の配列として割り当てられたと判断された場合を除きます。それ以外の場合は、この構造体または型へのポインタに変換しないでください。 、しかし、このメモリの断片は、この型の構造体または型にメモリがコピーされてから、その構造体または型にアクセスする必要があります。これは、このメモリの先頭アドレスがこの構造またはタイプに従ってアラインされていないと、アクセス時にバス エラーによってコア ダンプが発生しやすいためです。

3.5 スタック オーバーフロー

大きなローカル変数を使用しないでください (ローカル変数はすべてスタックに割り当てられるため)。スタック オーバーフローを引き起こしやすく、システムのスタックとヒープ構造を破壊し、不可解なエラーが発生します。 

4例

範囲外のメモリにアクセスするコードを記述します。

int main() {
    char *s = "hello world";
    *(s+1000) = 'x';
    return 0;
}

 コンパイル時には、-g オプションをオンにして実行する必要があります。

parallels@ubuntu-linux-20-04-desktop:~/leecode2/core$ gcc core.c -g -o core
parallels@ubuntu-linux-20-04-desktop:~/leecode2/core$ ll
total 24
drwxrwxr-x  2 parallels parallels  4096 May 10 00:55 ./
drwxrwxr-x 11 parallels parallels  4096 May  9 22:20 ../
-rwxrwxr-x  1 parallels parallels 10192 May 10 00:55 core*
-rw-rw-r--  1 parallels parallels    78 May  9 22:24 core.c
parallels@ubuntu-linux-20-04-desktop:~/leecode2/core$ ./core 
Segmentation fault (core dumped)
parallels@ubuntu-linux-20-04-desktop:~/leecode2/core$ 

次に、gdb を使用してコアダンプ ファイルをデバッグします。

parallels@ubuntu-linux-20-04-desktop:~/leecode2/core$ ll /var/crash/
total 1028
drwxrwsrwt  2 root      whoopsie     4096 May 10 00:55 ./
drwxr-xr-x 14 root      root         4096 Mar 13  2021 ../
-rw-------  1 parallels whoopsie   229376 May 10 00:55 coredump.core.330074
-rw-------  1 parallels whoopsie 17321984 May  9 22:29 coredump.thread.320247
-rw-r-----  1 root      whoopsie   798088 May  9 18:58 _usr_libexec_fwupd_fwupd.0.crash
parallels@ubuntu-linux-20-04-desktop:~/leecode2/core$ mv /var/crash/coredump.core.330074 ./
parallels@ubuntu-linux-20-04-desktop:~/leecode2/core$ ll
total 116
drwxrwxr-x  2 parallels parallels   4096 May 10 00:57 ./
drwxrwxr-x 11 parallels parallels   4096 May  9 22:20 ../
-rwxrwxr-x  1 parallels parallels  10192 May 10 00:55 core*
-rw-rw-r--  1 parallels parallels     78 May  9 22:24 core.c
-rw-------  1 parallels whoopsie  229376 May 10 00:55 coredump.core.330074
parallels@ubuntu-linux-20-04-desktop:~/leecode2/core$ gdb core coredump.core.330074
GNU gdb (Ubuntu 9.2-0ubuntu1~20.04) 9.2
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "aarch64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from core...
[New LWP 330074]
Core was generated by `./core'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x0000aaaad33e0738 in main () at core.c:3
3	    *(s+1000) = 'x';
(gdb) 

上記から、プログラムの問題は3行目に現れることがわかります。 

×

おすすめ

転載: blog.csdn.net/daida2008/article/details/124678792