4

最初に自分の PC で mcheck 機能をテストして、malloc consolidate エラーを検出したいと考えています。このようにして、これが組み込み Linux ボックスでの同様のクラッシュを把握するのに役立つと確信しています。残念ながら、クラッシュには少なくとも 3 ~ 4 日かかります。したがって、以下に示すようなクラッシュを生成するサンプル プログラムを探しています。

 Program terminated with signal 6, Aborted.
#0  0x2c73ebb8 in __syscall_kill (pid=900, sig=6) at kill.c:15
15  static inline _syscall2(int, __syscall_kill, __kernel_pid_t, pid,
int, sig);
Current language:  auto; currently c
#0  0x2c73ebb8 in __syscall_kill (pid=900, sig=6) at kill.c:15
    __res = 716485696
    __err = 16
#1  0x2c73eb5c in kill (pid=900, sig=6) at kill.c:19
No locals.
#2  0x2aafb2e0 in pthread_kill (thread=900, signo=6) at signals.c:73
    handle = (pthread_handle) 0x2ab3f2e0
    pid = 900
#3  0x2aafbbb8 in raise (sig=6) at signals.c:241
    retcode = 6
#4  0x2c730a5c in abort () at abort.c:94
    sigset = {__val = {32, 0 <repeats 31 times>}}
#5  0x2c738054 in __malloc_consolidate (av=0x2c798860) at free.c:227
    fb = (mfastbinptr *) 0x2c798864
    maxfb = (mfastbinptr *) 0x2c798880
    p = (mchunkptr) 0x2c798894
    nextp = (mchunkptr) 0x4a2b2948
    unsorted_bin = (mchunkptr) 0x2c798894
    first_unsorted = (mchunkptr) 0x4a22f7e0
    nextchunk = (mchunkptr) 0x2c798894
    size = 0
    nextsize = 0
    prevsize = 0
    nextinuse = 1
    bck = (mchunkptr) 0x4a2b2948
    fwd = (mchunkptr) 0x4a2b2948
#6  0x2c735ff0 in __malloc_inner (bytes=300) at malloc.c:912
    av = (mstate) 0x2c798860
    nb = 304
    idx = 32
    bin = (mbinptr) 0x2ac0dab4
    fb = (mfastbinptr *) 0x2ae11e50
    victim = (mchunkptr) 0x2ac0d9a4
    size = 719396432
    victim_index = 718311332
    remainder = (mchunkptr) 0x49759b58
    remainder_size = 40000
    block = 719396432
    bit = 718500504
    map = 719396432
    fwd = (mchunkptr) 0x1
    bck = (mchunkptr) 0x4a2164ac
    sysmem = (void *) 0x4975c9ac
#7  0x2c736c18 in malloc (bytes=300) at malloc.c:1172
4

4 に答える 4

3

これは、あなたのプログラムが、libc の malloc/free によって使用されるメモリ管理のデータ構造を破壊したためです。malloc/free には、ユーザー プログラム空間に独自のデータ レジデントがあり、異なるチャンク サイズで割り当てられた/解放された空間のリストを追跡します。どういうわけか、プログラムにバッファー オーバーランまたは安全でないランダム アクセスがあり、メモリ管理のデータまたはポインターが変更されている可能性があります。また、malloc/free を呼び出すプログラムの時点で、間違ったアドレスが使用され、segfault または中止が発生します。

valgrind の実行は非常に遅いです。おそらく、 setenv MALLOC_CHECK_ to 1 を試してプログラムを実行し、最初に診断メッセージを確認してください。

于 2013-09-20T04:13:38.137 に答える
1

これはあなたが求めているものですか?

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    int *num = malloc(sizeof(int));
    int *num2 = num;
    free(num);
    free(num2);
    printf("End\n");
    return 0;
}
于 2013-09-20T03:46:40.093 に答える
0
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    int *num1 = malloc(sizeof(int));
    int *num2 = malloc(sizeof(int));
    int *num3 = malloc(sizeof(int));
    int *num4 = malloc(sizeof(int));
    int *num5 = malloc(sizeof(int));

    free(num1);
    free(num3);
    free(num4);
    free(num2);
    free(num5);
    printf("End\n");
    return 0;
}
于 2013-09-20T15:54:13.940 に答える
0

サイズが 100 文字の *txt という名前のヒープを作成する場合の例。

char *txt = malloc(100*sizeof(char));

次に、誤って小さい変数をそのポインターに再割り当てします。

char a;
txt = a;

次に、障害のあるヒープに通常のテキストを割り当てようとします。

strcpy ("text",txt);

変数 (ポインター) をトレースし、すべての再割り当てを確認する必要がある可能性があります。

于 2013-09-21T16:13:47.303 に答える