-1

Sun コンパイラを使用する Solaris/Sparc/x86 から GCC 4.4.6 を使用する Red Hat Linux 6.2 にコードを移植しましたが、valgrind とコア ダンプでメモリ破損をレポートするコードに問題があります。

同じソースが、Sparc と x86 の両方の Solaris でエラーなしで実行されます。

エラーが発生する領域は、システム構成を取得するために呼び出している共有ライブラリにあります。

問題のあるメモリは、共有ライブラリ内のローカル スタック変数です。Valgrind は、障害が発生している実際の領域を特定するのに役立ちません。

「-d check -b -p 1」オプションを指定した DBGMEM メモリ デバッガは、レポートに表示されるメモリを検出せず、プログラムは正常に終了します。

「-v --leak-check=yes --read-var-info=yes」オプションを指定した valgrind メモリ デバッガーが失敗し、無効な書き込みが報告されます。

valgrind ログから:

==22043== Invalid write of size 8
==22043==    at 0x51DF74D: setLockingMode (db_support_funcs.c:258)
==22043==    by 0x40BF4E: GetAmaHdrParameters (AmaFileWriter.c:3707)
==22043==    by 0x40490E: MakeAMADNSFile (AmaFileWriter.c:899)
==22043==    by 0x403109: main (MakeAmaFile.c:775)
==22043==  Address 0x7fefebea8 is not stack'd, malloc'd or (recently) free'd
==22043== 
==22043== Invalid write of size 8
==22043==    at 0x51DF348: logconfig (db_support_funcs.c:228)
==22043==    by 0x51DF790: setLockingMode (db_support_funcs.c:257)
==22043==    by 0x40BF4E: GetAmaHdrParameters (AmaFileWriter.c:3707)
==22043==    by 0x40490E: MakeAMADNSFile (AmaFileWriter.c:899)
==22043==    by 0x403109: main (MakeAmaFile.c:775)
==22043==  Address 0x7fefebd68 is not stack'd, malloc'd or (recently) free'd
==22043== 
==22043== Invalid write of size 8
==22043==    at 0x51DF36A: logconfig (db_support_funcs.c:176)
==22043==    by 0x51DF790: setLockingMode (db_support_funcs.c:257)
==22043==    by 0x40BF4E: GetAmaHdrParameters (AmaFileWriter.c:3707)
==22043==    by 0x40490E: MakeAMADNSFile (AmaFileWriter.c:899)
==22043==    by 0x403109: main (MakeAmaFile.c:775)
==22043==  Address 0x7fefebcc8 is not stack'd, malloc'd or (recently) free'd
==22043== 
==22043== Invalid write of size 8
==22043==    at 0x51DF396: logconfig (db_support_funcs.c:177)
==22043==    by 0x51DF790: setLockingMode (db_support_funcs.c:257)
==22043==    by 0x40BF4E: GetAmaHdrParameters (AmaFileWriter.c:3707)
==22043==    by 0x40490E: MakeAMADNSFile (AmaFileWriter.c:899)
==22043==    by 0x403109: main (MakeAmaFile.c:775)
==22043==  Address 0x7fefeacb8 is not stack'd, malloc'd or (recently) free'd
==22043== 
==22043== 
==22043== Process terminating with default action of signal 11 (SIGSEGV): dumping core
==22043==  Access not within mapped region at address 0x7FEFEACB8
==22043==    at 0x51DF396: logconfig (db_support_funcs.c:177)
==22043==    by 0x51DF790: setLockingMode (db_support_funcs.c:257)
==22043==    by 0x40BF4E: GetAmaHdrParameters (AmaFileWriter.c:3707)
==22043==    by 0x40490E: MakeAMADNSFile (AmaFileWriter.c:899)
==22043==    by 0x403109: main (MakeAmaFile.c:775)
==22043==  If you believe this happened as a result of a stack
==22043==  overflow in your program's main thread (unlikely but
==22043==  possible), you can try to increase the size of the
==22043==  main thread stack using the --main-stacksize= flag.
==22043==  The main thread stack size used in this run was 10485760.

db_support_funcs.c でソースを呼び出す関数は次のとおりです。

-- line 255 -- void setLockingMode( short locking )
-- line 256 -- {
-- line 257 --    logconfig(0, LOG_DEBUG1, "DEBUG1:[%s:%d]:setLockingMode(locking=%d), currently %d", __FILE__,__LINE__, locking, disable_lock);
-- line 258 --    disable_lock = locking;
-- line 259 -- }

-- line 168 -- void logconfig( int errnoflag, int level, const char *fmt, ... )
-- line 169 -- {
-- line 170 --    va_list     ap;
-- line 171 --    int         errno_save = errno; /* Value caller might want printed */
-- line 172 --    long        n;
-- line 173 --    time_t      curr_time;
-- line 174 --    struct tm   *curr_tm,
-- line 175 --                *stat_tm;
-- line 176 --    struct stat stat_buff;
-- line 177 --    char        buff[BIG_BUFFER_LEN];
-- line 178 --    static char pid_str[MAX_PATH_LEN];
-- line 179 --    static int  first_time = 1;

コードは、次のスイッチ オプションを使用してコンパイルされました。 DNOPROTX -pthread -D__LITTLE_ENDIAN=1234 -D_LITTLEENDIAN -DL_ENDIAN -fPIC -DTHREAD_SAFE -shared -fPIC

アプリ: -D_LINUX_SOURCE -DLINUX -D_REENTRANT -DDEBUG_ENABLED -Wall -Wwrite-strings -DDEBUG -g -fstack-check -Wmissing-prototypes -Wpointer-arith -Wcast-align -DNOPROTX -pthread -g -D__LITTLE_ENDIAN=1234 -D_LITTLEENDIAN -DL_ENDIAN -fPIC

gcc バージョン 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC) を使用しています

4

1 に答える 1

0

エラーは主にログ関数のローカル変数に対して報告されているため、プログラムがスレッドのスタックをオーバーランしていると推測されます。レポートの下部には、次のようなヒントがあります。

==22043==  If you believe this happened as a result of a stack
==22043==  overflow in your program's main thread (unlikely but
==22043==  possible), you can try to increase the size of the
==22043==  main thread stack using the --main-stacksize= flag.
==22043==  The main thread stack size used in this run was 10485760.

valgrindメイン スレッド スタックに 10MB を使用しています。このスタック サイズを、valgrindエラー レポートのコール チェーンの各関数によってスタックで使用される予想メモリと比較します。

于 2013-07-26T19:36:04.867 に答える