控えめに言っても、私は小さなメモリの問題を抱えており、原因を特定するためのツールやアイデアが不足しています。
4.4.4 以降および 4.7.1 より前の GCC で最適化されたコンパイルでスタック破壊の問題が発生した、高度にマルチスレッド化された (pthreads) C/C++ プログラムがあります。
症状は、スレッドの 1 つの作成中に、%RIP だけでなく、すべての親フレームとほとんどのレジスタが 0x00 またはその他の意味のないアドレスであるフル スタック スマッシュを取得することです。どのスレッドが問題を引き起こしているかはランダムに見えますが、ログ メッセージから判断すると、同じコードの塊に分離されているようで、新しいスレッドの作成である程度再現可能なポイントに来ているようです。
問題のあるファイル内の print() は、これまでのところ、アクティブなセクションを絞り込もうとする際に信頼できないことが証明されているため、これにより、問題のあるコードをトラップして、数千行の単一のコンパイル単位よりも狭く分離することが非常に困難になりました。 .
最終的にスタックを破壊するスレッドから派生するスレッドの作成は次のとおりです。
extern "C"
{
static ThreadReturnVal ThreadAPI WriterThread(void *act)
{
Recorder *rec = reinterpret_cast (act);
xuint64 writebytes;
LoggerHandle m_logger = XXGetLogger("WriterThread");
if (SetThreadAffinity(rec->m_cpu_mask))
{ ... }
SetThreadPrio((xint32)rec->m_thread_priority);
while (true)
{
... poll a ring buffer ... Hard Spin 100% use on a single core, this is that sort of crazy code.
}
}
デバッグ ビルドを試しましたが、この症状は最適化されたビルド (-O2 以上) でのみ発生します。Valgrind/memcheck と DRD を試しましたが、どちらもスタックが吹き飛ばされる前に問題を見つけることができませんでした (障害が発生するまでに約 12 時間かかります)。
-O2 -Wstack-protector を使用してコンパイルすると何も問題はありませんが、-fstack-protector-all を使用してビルドするとバグから保護されますが、エラーは発生しません。
Electric-Fence もトラップしますが、それはスタックがなくなった後でのみです。
質問:問題のあるセクションを絞り込むには、他にどのようなツールや手法が役立ちますか?
どうもありがとう、 -- ビル