2017-12-10 8 views
4

謎:メモリ割り当て、valgrindのとGDBを扱っている間、私は無効なフリーでシンプルなCプログラムを書かなければならなかったLinuxのバックトレースとメモリ・マップ

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

int main (void) 
{ 
    int* arr = (void*) malloc(100 * sizeof(int)); 
    arr[50] = 10; 
    free(arr + (20 * sizeof(int))); 
    printf("arr[50] = %d\n", arr[50]); 
    return 0; 
} 

必要に応じて、エラーを生成する:

*** Error in `./allocWithFunnyFree': free(): invalid pointer: ... *** 
======= Backtrace: ========= 
... 
======= Memory map: ======== 
... 

次に、sdtoutstderr/dev/nullにリダイレクトして出力を取り除こうとしましたが、出力がまだ印刷されていて、それが私を困惑させてしまったことに気付きました。私は命令デバッガでfree()呼び出しの前に、プログラムを立ち止まっ

は、 /proc/PID/fd DIRを見上げて、再び、私は答えをオンラインで検索

すべて/dev/nullに記載されているFDさんが、それでも同じ結果を..リダイレクトしようとしたいくつかを尋ねました誰も私にこの出力がどのように出力され、どのようにリダイレクトできないのかを説明することはできませんでした。

私はオペレーティングシステム/ Linuxについてよくわからないことがたくさんありますが、ここで何が起こっているのか理解できたら幸いです。
ありがとうございます!

答えて

4

バックファイル(glibc)are printed to /dev/ttyは、1と2よりも異なるファイルディスクリプタ(プログラムでは3になる)となり、シェルはそれについて知りません。

Glibcには、他の場所にリダイレクトできる環境変数LIBC_FATAL_STDERR_があります。たとえば、あなたがstderrにバックトレースをリダイレクトすることができます

$ export LIBC_FATAL_STDERR_=2 
$ ./allocWithFunnyFre 2>free_backtrace 

あなたがstraceの下でプログラムを実行した場合、あなたはそれをよりよく理解する(そしてどのようにバックトレースが書かれている)ことができます。

関連する問題