問題タブ [heap-corruption]
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++ - スタック変数へのポインタをrealloc()に渡すことは有効ですか?
正常に動作しているように見えますが、スタックとヒープについてはまだ少し混乱しています。これは許可されていますか?許可されている場合、myString
手動で解放する必要がありますか、それともスコープ外になったときに解放されますか?
編集:回答ありがとうございますので、これも同様に違法だと思います
c++ - ヒープ破損エラーをデバッグする方法は?
Visual Studio 2008で(ネイティブ)マルチスレッドC ++アプリケーションをデバッグしています。一見ランダムな場合に、「Windowsがブレークポイントをトリガーしました...」というエラーが表示されます。これは、ヒープ。これらのエラーは、すぐにアプリケーションをクラッシュさせるとは限りませんが、すぐにクラッシュする可能性があります。
これらのエラーの大きな問題は、破損が実際に発生した後にのみポップアップすることです。これにより、特にマルチスレッドアプリケーションでは、エラーの追跡とデバッグが非常に困難になります。
どのようなことがこれらのエラーを引き起こす可能性がありますか?
それらをデバッグするにはどうすればよいですか?
ヒント、ツール、方法、啓発...大歓迎です。
c++ - ヒープの破損
char 配列の new と delete の間に巨大なコードがあると、なぜ問題になるのでしょうか。
c++ - ポインターを削除するとヒープが破損することがある
カスタム スレッド プール クラスを使用して実行するマルチスレッド アプリケーションがあります。スレッドはすべて、異なるパラメータで同じ関数を実行します。
これらのパラメーターは、次の方法でスレッドプール クラスに与えられます。
スレッドは何もすることがなくなるとすぐに、次のパラメーターを取得してジョブ関数を実行します。スレッドプール クラスのパラメーターを削除することにしました。
ただし、そうすると、ヒープ破損エラーが発生することがあります。
RtlFreeHeap に無効なアドレスが指定されました
奇妙なことに、あるケースでは完全に動作しますが、別のプログラムではこのエラーでクラッシュします。他の場所でポインターを削除しようとしました:ジョブ関数の実行後のスレッド(同じヒープ破損エラーが発生します)またはジョブ関数自体の最後(この場合はエラーなし)。
異なる場所から同じポインター (チェックしたところ、アドレスは同じです) を削除すると、どのように変化するのかわかりません。これは、マルチスレッドであるという事実と関係がありますか?
パラメータへのアクセスを処理するクリティカル セクションがあります。問題は同期アクセスに関するものではないと思います。とにかく、デストラクタはすべてのスレッドが完了したときにのみ呼び出され、他の場所のポインタは削除しません。ポインタを自動的に削除できますか?
私のコードは。ジョブのリストは、ジョブの ID (後で特定のジョブの出力を取得できるようにするために使用されます) とパラメーターで構成される構造のキューです。
getNextJob()
最後のジョブの実行が終了するたびに、スレッドによって呼び出されます (スレッドは ThreadPool へのポインターを持っています)。
c++ - priority_queue の問題 - ヒープ後のメモリ書き込み
priority_queue を使用しようとしていますが、プログラムが常にエラー メッセージ HEAP CORRUPTION DETECTED で失敗します。
ここにスニペットがあります:
クラス Message にはオーバーロードされた演算子 > および < があります
ここで私はキューをいっぱいにします:
メインプログラムでは:
何が問題なのかわかりません。8個くらいプッシュすると発生し、オンラインで失敗する
< キュー > で
:(
メッセージ クラスの定義は次のとおりです。非常に単純です。
};
ポルカ - メッセージ
heap-corruption - リリース/本番バージョンでヒープが破損しました。それを防ぐ解決策は?
私たちの会社では、どういうわけかクラッシュしたコードを本番環境に取得しました(ヒープが何らかの形で破損したため)。開発者が開発し、その後テスターが手を動かし、その後自然にリリースされました(月次リリース)。クラッシュするまではすべて問題ありませんでした...調査を試みたところ、ヒープが破損する可能性のある多くの場所が見つかりました...これを防ぐにはどうすればよいでしょうか? 私たちのコード レビューに打撃を与えましたか (常に 4/5 であり、コーダーの助けなしにそれを行っている開発者は 1 人だけです)? メモリ管理の政治を、スマート ポインターなどを介してのみ変更しますか? どんなアドバイスでもいいです!
heap-memory - 関数リターンの前後の_CrtCheckMemory
次のコード:
デバッガーは2番目の_CrtCheckMemory()でヒープチェック関数にトラップし、ヒープに問題があることを通知します。したがって、私の想定では、generate_poisson関数が混乱しています。ただし、-_CrtCheckMemory();を追加した場合。generate_poisson関数の最後で、戻る直前に直接呼び出します。その後、デバッガーは、新しく追加された_CrtCheckMemory()ではなく、以前と同じ行にトラップします。
これはどういう意味ですか?
ありがとう!
//編集:別のスレッドがヒープを台無しにしている可能性がありますか、それとも_CrtCheckMemory()は現在のスレッドのヒープのみをチェックしますか?
delphi - Delphi で VMT またはヒープの破損を検出するための適切なツールは何ですか?
私は、大規模なアプリケーションに Delphi 2007 を使用しているチームのメンバーです。他に説明のつかない奇妙なバグが時々あるため、ヒープの破損が疑われます。コンパイラの Rangechecking オプションは配列専用だと思います。アプリケーションによって割り当てられていないメモリ アドレスに書き込みがあった場合に、例外またはログを記録するツールが必要です。
よろしく
EDIT : エラーのタイプは次のとおりです。
エラー: モジュール 'BoatLogisticsAMCAattracsServer.exe' のアドレス 00404E78 でアクセス違反が発生しました。アドレス FFFFFFDD の読み出し
EDIT2:すべての提案をありがとう。残念ながら、解決策はそれよりも深いと思います。ソースを所有しているため、パッチを適用したバージョンの Bold for Delphi を使用しています。おそらく、Bold フレームワークで導入されたいくつかのエラーがあります。はい、JCL によって処理され、メッセージをトレースするコールスタックを含むログがあります。したがって、例外のあるコールスタックは次のようにロックできます。
内部例外部分は、例外が再発生した瞬間のコールスタックです。
EDIT3:現在の理論は、仮想メモリテーブル(VMT)が何らかの形で壊れているというものです。これが発生した場合、その兆候はありません。メソッドが呼び出されたときにのみ例外が発生します (アドレス FFFFFFDD でALWAYS、10 進数で -35) が、それでは遅すぎます。エラーの本当の原因がわからない。このようなバグをキャッチする方法のヒントは本当にありがたいです!!! SafeMM で試してみましたが、3 GB フラグを使用してもメモリ消費量が多すぎることが問題です。だから今、私はSOコミュニティに報奨金を与えようとしています:)
EDIT4: 1つのヒントは、ログによると、この前に別の例外がしばしば(または常に)あるということです。たとえば、データベースの楽観的ロックなどです。強制的に例外を発生させようとしましたが、テスト環境では問題なく動作します。
EDIT5:話は続きます... 過去 30 日間のログを検索しました。結果:
- 「アドレス FFFFFFDB の読み出し」 0
- 「アドレス FFFFFFDC の読み出し」 24
- 「アドレス FFFFFFDD の読み取り」 270
- 「アドレス FFFFFFDE の読み出し」 22
- 「アドレス FFFFFFDF の読み出し」 7
- 「アドレス FFFFFFE0 の読み出し」 20
- 「アドレス FFFFFFE1 の読み出し」 0
したがって、現在の理論では、列挙型 (ボールド体にたくさんあります) がポインターを上書きします。上記の異なるアドレスで 5 件ヒットしました。列挙型が 5 つの値を保持し、2 番目の値が最も使用されていることを意味する可能性があります。例外が発生した場合、データベースのロールバックが発生し、Boldobjects が破棄される必要があります。おそらく、すべてが破棄されるわけではなく、列挙型がまだアドレスの場所に書き込むことができる可能性があります。これが本当なら、5 つの値を持つ列挙型の正規表現でコードを検索することは可能でしょうか?
EDIT6:要約すると、問題の解決策はまだありません。コールスタックで少し誤解を招く可能性があることは承知しています。はい、タイマーがありますが、タイマーのない他のコールスタックがあります。そのために残念。しかし、2つの共通点があります。
- アドレス FFFFFFxx の読み取りによる例外。
- コールスタックのトップは System.TObject.InheritsFrom (sys\system.pas:9237) です。
これは、 VilleKが問題を最もよく説明していることを確信させてくれます。また、問題は Bold フレームワークのどこかにあると確信しています。しかし、大きな問題は、このような問題をどのように解決できるかということです。VilleKのような Assert を提案するだけでは十分ではありません。損傷は既に発生しており、その時点でコールスタックはなくなっているからです。したがって、エラーの原因についての私の見解を説明するには、次のようにします。
- どこかでポインターに不適切な値 1 が割り当てられていますが、0、2、3 などになることもあります。
- オブジェクトがそのポインターに割り当てられます。
- オブジェクトの基底クラスにメソッド呼び出しがあります。これにより、メソッド TObject.InheritsForm が呼び出され、アドレス FFFFFFDD に例外が発生します。
これら 3 つのイベントはコード内で一緒に使用できますが、後で使用することもできます。これは最後のメソッド呼び出しにも当てはまると思います。
EDIT7:私たちは Bold Jan Norden の作者と緊密に協力しており、彼は最近、Bold フレームワークの OCL エバリュエーターにバグを発見しました。これが修正されたとき、これらの種類の例外は大幅に減少しましたが、それでも時々発生します。しかし、これがほぼ解決されたことは大きな安堵です。
c++ - C++ でパラメータの破損をデバッグしていますか?
私は自分のプロジェクト (Linux で実行中) にプラグイン システムを持っています。これの一部は、プラグインに次のような「実行」メソッドがあることです。
プラグインを呼び出して argv 配列をチェックしようとしましたが (他の多くのことを行った後)、配列が破損しています。関数の先頭に値を出力できますが、それらは正しいですが、後で実行することはできません。明らかに何かがヒープを破損していますが、そのメモリを上書きしているものを正確に特定する方法がわかりません。Valgrind は私をあまり助けてくれませんでした。
リクエストによるサンプルコード:
私のプラグインは次のようになります。
これは、Python に公開するシステムにリンクされているため、これらのプラグインを Python 関数として呼び出すことができます。だから私は自分のpython関数に文字列パラメータを取り、それを次のように分割します:
結果の argc と argv は、上記のプラグインに渡されます。