1

私は実行するプログラムを書きました

  1. 20秒ごと
  2. そのコードを実行する特定のリクエストが来たとき。
  3. 1分ごと。

上記のリストの 1 と 3 は 2 つの異なるインスタンスであり、重複する可能性があります。

プログラム

障害を与える関数のシグネチャ。

bool ProcessInfoHandler::getCPUInfo (rsc::ProcInfo &procInfo, bool isThreadCall)

プログラムを約 3 日間実行した後、以下のクラッシュが発生します。

#2  0x000000000041fdb8 in sn_sig_handler (signum=6, siginfo=0x451a7d80, undocumented=    <value optimized out>) at common/main/sn_proc_main.cpp:109
#3  <signal handler called>
#4  0x00000031d9630265 in raise () from /lib64/libc.so.6
#5  0x00000031d9631d10 in abort () from /lib64/libc.so.6
#6  0x00000031d966a84b in __libc_message () from /lib64/libc.so.6
#7  0x00000031d967230f in _int_free () from /lib64/libc.so.6
#8  0x00000031d967276b in free () from /lib64/libc.so.6  
#9  0x00000000004367a5 in deallocate (this=0x66cff0, __position=..., __x=<value optimized out>)
at /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/ext/new_allocator.h:94
#10 _M_deallocate (this=0x66cff0, __position=..., __x=<value optimized out>) at /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:133 
#11 std::vector<cpu_instance_data_t, std::allocator<cpu_instance_data_t> >::_M_insert_aux (this=0x66cff0, __position=..., __x=<value optimized out>)
at /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/vector.tcc:299
#12 0x0000000000431f8e in ProcessInfoHandler::getCPUInfo (this=<value optimized out>, procInfo=..., isThreadCall=false)
at /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:610
#13 0x00000000004333be in ProcessInfoHandler::getProcessInformation (this=0xc16f9c0, procInfoSeq=..., isThreadCall=false) at processinfohandler.cc:255

私の質問

  1. ファイル名と行番号が指定されているフレーム 13 とは異なり、フレーム 12 にはその情報が指定されていません。これは、ベクトルの参照渡しに問題があるということですか?
  2. この特定のスタック トレースをデバッグする方法についての指針はありますか?

のコードはgetCPUInfo所有権上の理由により提供できません。同じ回避策があれば提案してください。

4

1 に答える 1

2

への呼び出しstd::vector<>::_M_insert_aux()は、ベクトルが変更されていることを示します。getCPUInfoこのコードを (複数のスレッドで) 同時に呼び出すことができ、これが「3 つのリスト」によって暗示されている場合は、スレッドを同期するためにミューテックスなどを用意する必要があります。

std::vectorスレッドセーフではありません。

于 2012-11-23T08:11:37.190 に答える