0

C の変数宣言で問題が発生しました。助けていただければ幸いです。

このコード:

int makeDir(const char* path, mode_t mode) {
    printf("Checkpoint 1\n");
    String parentPath;
    printf("Checkpoint 2\n");
    pDirTreeNode parent;
    printf("Checkpoint 3\n");
    int idx, grp;
    pinode inod;
    pdir algo=NULL;
    printf("Checkpoint 4\n");
    pdir direntry=NULL;
    printf("Checkpoint 5\n");
    t_bitarray *bitarr;

    parent = malloc(sizeof(struct dirTreeNode));
    parentPath = malloc(DIR_NAME_SIZE);
    direntry=malloc(sizeof(struct s_direct));

    [COMMENTED code]
}

そして、これらはデータ型宣言です:

typedef struct s_inode      *pinode;    
typedef struct s_direct     *pdir;      
typedef char                *String;    
typedef struct dirTreeNode  *pDirTreeNode; 

s_inode と s_direct が linux/ext2_fs.h ヘッダーで宣言されている

私はそれを実行しました。プログラムが関数に到達すると、プロンプトが表示されます。

共有ライブラリ イベント /build/buildd/gdb-7.3/gdb/dwarf2loc.c:185: 内部エラー: dwarf_expr_frame_base: アサーション `framefunc != NULL' が失敗したため停止しました。GDB 内部の問題が検出されました。これ以上のデバッグは信頼できないことが判明する可能性があります。

ただし、デバッグ セッションは停止しません。次に、残りのコードを実行すると:

*** glibc detected *** /home/vlad/workspace_SisOp/RFSDev/Debug/RFSDev: realloc(): invalid next size: 0x0000000000a5cdf0 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x7a6e6)[0x7fa21d6e26e6]
/lib/x86_64-linux-gnu/libc.so.6(+0x7d3e7)[0x7fa21d6e53e7]
/lib/x86_64-linux-gnu/libc.so.6(realloc+0xf9)[0x7fa21d6e6b39]
/home/vlad/workspace_SisOp/RFSDev/Debug/RFSDev[0x402cd3]
/home/vlad/workspace_SisOp/RFSDev/Debug/RFSDev[0x4017a4]
/home/vlad/workspace_SisOp/RFSDev/Debug/RFSDev[0x400af7]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7fa21d68930d]
/home/vlad/workspace_SisOp/RFSDev/Debug/RFSDev[0x4009e9]
======= Memory map: ========
00400000-00404000 r-xp 00000000 00:14 540784                             /home/vlad/workspace_SisOp/RFSDev/Debug/RFSDev
00603000-00604000 r--p 00003000 00:14 540784                             /home/vlad/workspace_SisOp/RFSDev/Debug/RFSDev
00604000-00605000 rw-p 00004000 00:14 540784                             /home/vlad/workspace_SisOp/RFSDev/Debug/RFSDev
00a5c000-00a7d000 rw-p 00000000 00:00 0                                  [heap]
7fa214000000-7fa214021000 rw-p 00000000 00:00 0 
7fa214021000-7fa218000000 ---p 00000000 00:00 0 
7fa21b706000-7fa21b71b000 r-xp 00000000 08:16 526333                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7fa21b71b000-7fa21b91a000 ---p 00015000 08:16 526333                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7fa21b91a000-7fa21b91b000 r--p 00014000 08:16 526333                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7fa21b91b000-7fa21b91c000 rw-p 00015000 08:16 526333                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7fa21b91c000-7fa21d668000 rw-p 00000000 00:14 273074                     /home/vlad/Sistemas Operativos/ext2.disk
7fa21d668000-7fa21d7ff000 r-xp 00000000 08:16 526221                     /lib/x86_64-linux-gnu/libc-2.13.so
7fa21d7ff000-7fa21d9fe000 ---p 00197000 08:16 526221                     /lib/x86_64-linux-gnu/libc-2.13.so
7fa21d9fe000-7fa21da02000 r--p 00196000 08:16 526221                     /lib/x86_64-linux-gnu/libc-2.13.so
7fa21da02000-7fa21da03000 rw-p 0019a000 08:16 526221                     /lib/x86_64-linux-gnu/libc-2.13.so
7fa21da03000-7fa21da09000 rw-p 00000000 00:00 0 
7fa21da09000-7fa21da2a000 r-xp 00000000 08:16 523159                     /lib/x86_64-linux-gnu/ld-2.13.so
7fa21dc10000-7fa21dc13000 rw-p 00000000 00:00 0 
7fa21dc26000-7fa21dc29000 rw-p 00000000 00:00 0 
7fa21dc29000-7fa21dc2a000 r--p 00020000 08:16 523159                     /lib/x86_64-linux-gnu/ld-2.13.so
7fa21dc2a000-7fa21dc2c000 rw-p 00021000 08:16 523159                     /lib/x86_64-linux-gnu/ld-2.13.so
7fff21b19000-7fff21b3a000 rw-p 00000000 00:00 0                          [stack]
7fff21ba2000-7fff21ba3000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
Checkpoint 1
Checkpoint 2
Checkpoint 3
Checkpoint 4
Checkpoint 5

デバッグ セッションでは、コードは実際に perror("1") の直後に爆発しているため、単なる perror の問題ではないようです...

前もって感謝します!

編集:エラーを回避するために、ダンプ メッセージと関数のコードを変更しました。また、これは完全なメイン コードです。

pext2fs fsys; // Variable global

int main(int argv, char *argc[]) {
    fsys = malloc(sizeof(struct ext2system));

    getsysdata();

    /*                                              *
     *                                              *
     *                                              *
     * File System Client here                      *
     *                                              *
     *                                              *
     *                                              */

    /* ------------------>Código para probar funciones<------------------ */

    pDirTreeNode node;
    StringArray test;
    void **file=malloc(0);
    int ctrl, mode=0x1000;
    pdir *dirents;

    makeDir("\\Dir2\\DirCreadoInternamente", mode);
    node = getDirTreeNode("\\Dir2\\DirCreadoInternamente");
    //  dirents = list_dir(fsys->root);
    //  node = getDirTreeNode("\\Dir3\\UnDir");
    //  ctrl = getFile(&file, "\\Dir1\\LPD");
    //  printFile(file);

    /* ------------------>Fin del código de testing<------------------ */

    unmap(fsys->diskmap);

    return 0;
}
4

2 に答える 2

2

このperror()関数は、 の現在の値に応じてエラー メッセージを出力しますerrno。を設定する関数を呼び出した後にのみ呼び出すのが理にかなっていますerrno

例えば:

String parentPath;
perror("2");

意味のある値に設定するようなことは何もしていないerrnoので、ガベージを取得しています。(errnoおそらくEINVAL、以前の への呼び出しの副作用として に設定されていましたperror())。

の値は、どのエラーが発生したerrnoかを示します。(調べるか呼び出すことによって) チェックする前に、まずエラーが発生したかどうかを判断する必要があります。設定するほとんどの関数は、成功または失敗を示す値も返します。たとえば、失敗すると null ポインターを返します。errnoperror()errnomalloc()

于 2012-06-24T03:32:26.570 に答える
1

さまざまなライブラリ関数がerrno任意の値を設定することがありますが、エラー値を返さない限り、実際にはエラーは発生していませerrno

于 2012-06-24T03:31:57.617 に答える