軽く書くために、私は小さなメモリの問題があり、原因を特定するためのツールやアイデアが不足しています。スタックを分離するためのツール
私は高度なマルチスレッド(pthreads)C/C++プログラムを持っています。このプログラムは、4.4.4以降、4.7.1より前のGCCで最適化されたコンパイルでスタック・スマッシングの問題を発生させました。
症状は、スレッドの作成中に、%RIPだけでなく、すべての親フレームと、ほとんどのレジスタが0x00または他の非センスアドレスであることです。 問題を引き起こすスレッドは一見無作為ですが、ログメッセージで判断すると同じHunkのコードに分かれているように見えますが、新しいスレッドの作成時には半反復可能なポイントになるようです。
これは、違反しているファイル内のprint()がこれまでのところ、コンパイル単位が1000行の単一のコンパイル単位より狭くトラップして分離するのを難しくしましたアクティブなセクションを下に移動します。
最終的にスタックスマッシュスレッドをオフリードスレッドの作成は、次のとおりです。
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以上、最適化ビルドにのみ存在します。
Aは、-O2 -Wstack-プロテクタが間違って何も見ないでコンパイルし を私はValgrindの/ memcheckやDRDを試してみましたが、両方のスタックが吹き飛ばさ(と失敗に到達するために12時間の程度かかります)される前に、すべての問題を見つけることができませんしかし、-fstack-protector-allでビルドするとバグから私を守りますが、エラーは発生しません。
エレクトリックフェンスもトラップしますが、スタックがなくなった後のみです。
質問:問題のあるセクションを絞り込むのに役立つツールやテクニックは他にありますか?
多くのおかげで、 --Bill
OK。私は噛むだろう...どのスタックは壊される? –
作成スレッドのスタックであれば、いくつかのコードがうまくいくかもしれません - 新しいスレッドに何を渡すのですか? –
明確にするために、g ++ 4.4.2と4.8で正常に動作しているとか、それらのバージョンがテストされていないと言っていますか? –