0

以下に示すように、プロセスダンプが常にコアを生成するたびに、マルチスレッドアプリケーションに取り組んでいます。実際にダンプしている場所を理解できません。

GNU gdb Red Hat Linux (6.5-25.el5rh)
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu"...(no debugging symbols found)
Using host libthread_db library "/lib64/libthread_db.so.1".


warning: exec file is newer than core file.
Core was generated by `multithreadprocess                                                                       '.
Program terminated with signal 11, Segmentation fault.
#0  0x0000000000448f7a in std::ostream::operator<< ()
(gdb) where
0x000000000044bd32 in std::ostream::operator<< ()
#1  0x0000000000450b21 in std::ostream::operator<< ()
#2  0x000000000042eda9 in std::string::operator= ()
#3  0x00000030582062e7 in start_thread () from /lib64/libpthread.so.0
#4  0x00000030576ce3bd in clone () from /lib64/libc.so.6

(gdb)thread apply all bt 
Thread 6 (process 11674):
#0  0x000000305820a687 in pthread_cond_timedwait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1  0x0000000000431140 in std::string::operator= ()
#2  0x00000030582062e7 in start_thread () from /lib64/libpthread.so.0
#3  0x00000030576ce3bd in clone () from /lib64/libc.so.6

Thread 5 (process 11683):
#0  0x000000305820cbfb in write () from /lib64/libpthread.so.0
#1  0x0000000000449151 in std::ostream::operator<< ()
#2  0x000000000043b74a in std::string::operator= ()
#3  0x000000000046c3f4 in std::string::substr ()
#4  0x000000000046e3c1 in std::string::substr ()
#5  0x00000000004305a4 in std::string::operator= ()
#6  0x00000030582062e7 in start_thread () from /lib64/libpthread.so.0
#7  0x00000030576ce3bd in clone () from /lib64/libc.so.6

Thread 4 (process 11744):
#0  0x00000030576c5896 in poll () from /lib64/libc.so.6
#1  0x0000000000474f1c in std::string::substr ()
#2  0x000000000043b889 in std::string::operator= ()
#3  0x0000000000474dbc in std::string::substr ()
#4  0x00000000004306a5 in std::string::operator= ()
#5  0x00000030582062e7 in start_thread () from /lib64/libpthread.so.0
#6  0x00000030576ce3bd in clone () from /lib64/libc.so.6

Thread 3 (process 11864):
#0  0x000000305820a687 in pthread_cond_timedwait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1  0x0000000000431140 in std::string::operator= ()
#2  0x00000030582062e7 in start_thread () from /lib64/libpthread.so.0
#3  0x00000030576ce3bd in clone () from /lib64/libc.so.6

Thread 2 (process 11866):
#0  0x000000305820a687 in pthread_cond_timedwait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1  0x0000000000431140 in std::string::operator= ()
#2  0x00000030582062e7 in start_thread () from /lib64/libpthread.so.0
#3  0x00000030576ce3bd in clone () from /lib64/libc.so.6

Thread 1 (process 11865):
#0  0x000000000044bd32 in std::ostream::operator<< ()
#1  0x0000000000450b21 in std::ostream::operator<< ()
#2  0x000000000042eda9 in std::string::operator= ()
#3  0x00000030582062e7 in start_thread () from /lib64/libpthread.so.0
#4  0x00000030576ce3bd in clone () from /lib64/libc.so.6

btをいっぱいにすると、このように表示されます

(gdb) bt full
#0  0x000000000044bd32 in std::ostream::operator<< ()
No symbol table info available.
#1  0x0000000000450b21 in std::ostream::operator<< ()
No symbol table info available.
#2  0x000000000042eda9 in std::string::operator= ()
No symbol table info available.
#3  0x00000030582062e7 in start_thread () from /lib64/libpthread.so.0
No symbol table info available.
#4  0x00000030576ce3bd in clone () from /lib64/libc.so.6
No symbol table info available.
4

2 に答える 2

1

適切なフラグなしでマルチスレッド アプリケーション内で iostream を使用しているように見えます。これを参照してください。特に、それが言うことに注意してください

libC ライブラリの iostream クラスを使用してマルチスレッド環境で実行するアプリケーションをビルドする場合は、-mt オプションを使用してアプリケーションのソース コードをコンパイルおよびリンクします。このオプションは、-D_REENTRANT をプリプロセッサに渡し、-lthread をリンカーに渡します。

これは特定のプラットフォーム用です。要件は異なる場合があります。

于 2010-02-22T16:25:16.710 に答える
1

GDB 6.5 はかなり古いものです。(現在の) GDB 7.0.1 から大幅に優れたスタック トレースが得られる可能性があります。

また、フラグなしでビルドされた最適化されたコードをデバッグしようとしているように見え-g、適切な実行可能ファイルをデバッグしていない可能性があります (GDB は、実行可能ファイルがコアよりも新しいことを警告します)。

実行可能ファイルとGDB 出力にリストされているすべてのライブラリ が、コアが生成されたシステムとコアを分析しているシステムの間で正確に一致していることを確認してください(それらが同じでない場合)。が一致しない場合、偽のスタック トレースが表示される可能性があります (投稿したスタック トレースは、私には完全に偽物に見えます)。info shared

于 2010-02-24T07:11:55.303 に答える