問題タブ [stack-dump]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - g++ 最適化 -O3 で奇妙なスタックダンプ エラーが発生しますか?
まず、私は 2 か月前に C/C++ のプログラミングを始めたばかりなので (ただし、Java の経験は豊富です)、C/C++ の経験はまったくありません。私は論文に取り組んでおり、その目的のために以前の研究のために書かれた他のコードを使用/拡張しています。
さて、このエラーは間違いなく私が今まで遭遇した中で最も奇妙なものであり、再現できる最も基本的な形式を見つけて絞り込むのにほぼ3時間かかりました..最後に、次のコードを含むこれら2つのファイルがあります
c.hh:
test.cc:
私が取り出すことができる唯一の行は、c.re の初期化、つまり "c->re = 0.0;" です。ただし、コードの下部を削除しても、c.reが初期化されていないため(またはそう思いますか?)、この行がないとエラーが発生するため、これを残しました。
エラーを再現するために必要であることがわかった他のすべてのもの、つまり
1) for ループ。i=1,2,3の行を分けて書いてもエラーにはなりません。
2) i! の限界 たとえば、i が 0 から 2 までしか実行されない場合、エラーは発生しません。少なくとも 3 回の反復後にのみ発生します。
3) 明示的な代入 "c->re = (c->re) +" では、"= (c->re) +" の代わりに "+=" を使用してもエラーは発生しません。
4) i "(i==1)?0:1" の評価および (!) 条件チェック。これを行うために if(..) を使用してもエラーが発生しますが、 i が使用されていない場合、または条件チェックが実行されていない場合はエラーは発生しません。
5) c.re.の出力 つまり、「std::cout << c->re;」です。c.re ("c->re;") を評価するだけではエラーにはなりません。また、c.re をまったく評価せずに出力だけがある場合でも、エラーは発生しません。「fprintf(stdout, "%d", c->-re);」で同じことを行う エラーの原因にもなります。
また、非常に重要なのは、次のようなコードをコンパイルした場合にのみエラーが発生することです。
「-O3」を省略してもエラーにはならないので、これがコードが理解できないエラーを生成する本当の理由だと思います。-O3 が使用されていることに注意してください。前述したように、このコードは、このような関数が何百万回も呼び出される可能性がある研究用に書かれているため、可能な限り最適化することをお勧めします。しかし、私は与えられたものからこの「慣習」を採用しただけであり、詳細や、それを使用した場合の結果が正確にどうなるかはわかりません。
その上、エラーが発生するたびに、プログラムはまったく実行されません。つまり、コードの最初の行であっても、任意の形式の出力をどこに置いても、「テスト」を実行するとすぐにエラーが発生し、何も出力されません。
最後に、プログラム「テスト」を実行しようとしたときに発生するエラーは次のとおりです。
スタックダンプ ファイルには次のものが含まれます。
あなたが言うことができるように、私はこの問題で非常に迷っており、何が起こっているのかわからない. この非常に単純なコードで間違っていることはありますか? -O3 最適化を除外せずにこの問題を「修正」する方法はありますか? それとも、それほど重要ではないのでしょうか?
十分な情報を提供できたと思います。助けてくれてありがとう!
c - Stackdump - コンパイルされた .c コード
次のコードを実行すると、次のスタック ダンプ エラー メッセージが表示されます。
印刷後
機能させるために何を変更すればよいか教えていただけますか? Windows 10 64ビットでSublime Textとcygwinでコンパイルしました。
これはコードです:
c++ - Linux backtrace および backtrace_symbols API を使用して、セグメンテーション違反の原因となっているスレッドを見つける方法
開発者の皆様、こんにちは。
C++ プログラムからスタック ダンプを分析しようとしています。この特定のプログラムでは、シグナル ハンドラーを作成しており、シグナル ハンドラー内には以下のようなコードがあります。
トレースを取得することはできますが、期待しているアドレスを見つけることができません。他のスレッドがスタックトレース バッファーをいっぱいにした可能性があるかどうか疑問に思っています (組み込みデバイスであり、バッファー サイズが制限されているため)。スタックトレースをスレッドごとに識別/フィルタリングする方法、またはスタックトレースをセグメンテーション違反をキャッチしたスレッドのみに制限するオプションはありますか。
注:スタックトレースに存在する実行可能ファイルから 2 つのアドレスを特定できます。ごく最近のものはシグナル ハンドラ自体のアドレスで、2 つ目は別のスレッドからのものです。
マルチスレッド環境でバックトレースがどのように機能するかについて、リソースをグーグルで検索しようとしました。オンですが、あまり情報が見つからないので、ここにいます。
ありがとう