問題タブ [memory-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++ - このコードがメモリを破壊するのはなぜですか?
これはかなり初心者の質問であり、合理的に迅速に回答できるはずです...
基本的に、echoでPrintfを最初に呼び出した後、 argsの内容が破損します。ポインターを間違って渡しているように思えます。しかし、理由がわかりませんか?
注これは製品コードではなく、単なる概念実証です。
編集g_PlatformDevice は RiseWindows タイプです。それが明確でない場合...
編集これは、vs2008 で実行されている Windows XP プラットフォーム上にあります。
更新 興味のある人にとっては、問題はオーバーフローした呼び出しスタックであり、スタックのさらに下にあり、この別の大きな配列が定義されていたようです。これをリファクタリングすると、メモリの破損がなくなりました。スタックバタリングにチョークアップ!
c# - PrintImageが破損したメモリエラーを引き起こしている
PrintImage
ActivePDF C#ライブラリの機能の使用に問題があります。これを使用して.gif画像をPDFに配置しようとすると、次のエラーメッセージが表示されます。
保護されたメモリの読み取りまたは書き込みを試みました。これは多くの場合、他のメモリが破損していることを示しています。
PrintJPEG
とPrintTIFF
画像機能は問題なく使用できます。誰かが以前にこの問題に遭遇したことがありますか?
c++ - VisualStudioのリリースで困惑するSTLのバグ
VisualStudio2005のオプティマイザーのバグであると確信しています。問題はSTLマップにあります。
関連するコードは次のとおりです。
デバッグで問題なく動作し、リリースでクラッシュし、グローバル最適化を無効にすることで「修正」されました。現在、何も動作しません。私は得る:
これは、最後のMyMapIterator::operator->で発生します。
マップは空です。findがend()を返す必要があることはわかっています。その効果に対する最初の2つの比較は機能します。しかし、どういうわけか、3回目の'myIt!= m_myMap.end()'はtrueを返し、&&の右側が実行されます。
'myIt!= m_myMap.end()'のバリアントが同じファイルでtrueを返すため、他のさまざまな場所がこのように失敗しますが、これは私にとって、他のほとんどの可能性を排除する場所です。以前は、マップを踏みにじっていたのはバッファオーバーフローだと思っていましたが、コードを振り返ってみてください。他のスレッドがそれを踏みつけていないことを私は確信しています、そしてこれは100%再現可能です。
それで、私はここから何をしますか。これは、パフォーマンスに少しでも影響されません。正常に機能するために必要です。任意のオプションが受け入れられます。はい、イテレータの等価性チェックですべてを囲むことができることはわかっていますが、これは最も優れたコードではありません。重要なのは、それはまだ機能するはずであり、それが失敗した場合、他の何でもできるということです。
編集
最後のelse-ジャンプが生成されない場合!
delphi - FastMM4は「ブロックヘッダーが破損しています」と表示します
過去に消えたこの厄介なバグがありましたが、かなり時間が経ってから戻ってきました。
2つのTSamオブジェクト(TPersistentから派生)を作成し、TAsmJobオブジェクト(TObjectListから派生)にロードしました。
実行時に、フォームはTStringGridを作成し、次にAsmJobを作成してこれら2つのSAMオブジェクトを作成します(そして、それぞれのディスクからデータをロードします)。AsmJobもグリッドに割り当てられます。フォームが破棄されると、グリッドはAsmJobを解放することで処理し、TSamオブジェクトを解放します。問題は次のとおりです。最初のオブジェクトは問題なく解放されますが、継承されたメソッド(Destroy destructor内)が呼び出されると、2番目のオブジェクトは停止します。
プログラム全体でFreeAndNilを使用して、オブジェクトを解放します。TSamオブジェクトはNILではありません!!!!! したがって、これはオブジェクトを解放する最初の試みです。オブジェクト内のデータでさえ一貫しています。
プログラムのバックボーンは次のようになります。
オブジェクトがリリースされた後、どこでオブジェクトをダブルフリーまたは上書きしようとしているのか、本当にわかりません。
編集:
私が得たエラーのいくつか:
FastMMは、フリーブロックスキャン操作中にエラーを検出しました。FastMMは、ブロックが解放された後に変更されたことを検出しました。
FastMMは、フリーブロックスキャン操作中にエラーを検出しました。ブロックヘッダーが破損しています。
詳細:
「範囲チェック」を含め、IDEですべての「デバッグ」オプションを有効にしています。また、FastMM4はスーパーアグレッシブデバッグモードに設定されています。FastMMがなくても、デバッガーの外でも、プログラムは問題なく実行されますが、バグがなくなったわけではありません。FastMMをインストールするまで、実際には(おそらく)1年以上機能していました。
編集:
みなさん、ありがとうございました。いいえ、私は少し良い方向に進んでいると感じています。
プログラムの構造はもっと複雑です。元の投稿を小さく保つためにバックボーンのみを提供しました。しかし、一体、それはすでに大きくなっています:)したがって、これらのTSamオブジェクトは、ディスクからデータをロードするために使用されます。各オブジェクトに1つのファイル。彼らはまた、いくつかの処理とデータ検証を行っています。これらのTSamのそれぞれについて、TSamオブジェクトに含まれるデータを画面に(グラフィカルに)表示するグラフィカルオブジェクトもあります。TStringGridの各行には、TSamのデータも表示されますが、テキストで表示されます。
私が持っている1つの質問:エラーがどこにあるかを見つけるためにプログラムを細かく分割しても、エラーはまだ表示されますか?または、この特定の構成でのみ表示することは可能ですか?
「TStringGridがAsmJobを破棄するように、AsmJobはどのようにTStringGridに割り当てられますか?」に対する回答。
次に、TForm.Create(グリッドを保持するフォーム)のどこかで、
MyGridのデストラクタでは、次のようにします。
visual-studio - Visual Studio 2008は、デバッグ時に保護されたメモリを読み書きします
新品のVistaマシンでは、プロジェクトをデバッグモードで開始しようとすると、次のエラーがすぐに発生します。
保護されたメモリの読み取りまたは書き込みを試みました。これは多くの場合、他のメモリが破損していることを示しています。
メッセージの「他のメモリが壊れています」の部分は購入しません。エラーは、新しいマシンに移動したばかりのプロジェクトに関連している可能性があると思いましたが、まったく新しい空白のプロジェクトでも同じ動作を示します。また、デバッグせずに起動してもメッセージが表示されません。
私はいくつかの修正についてオンラインで読みました:
- 2007年には、問題に対処する.NET2.0のサービスパックがありました。私は3.5SP1を使用しているので、それが問題だとは思えません。
- 参照するDLLは32ビットであり、問題が発生するため、x86用に明示的にコンパイルします。私はCore2Duoを使用していますが、Vista 32ビットを実行しているので、問題はないはずですよね?(さらに、テストプロジェクトでは、DLLはありません。)
- デバッグ中の「モジュールロード時のJIT最適化の抑制」のチェックを外します。私のために何もしませんでした。
- OS全体をワイプし、VS2008を再インストールします。(これは明らかに子供のために働いた。)私は今そのための時間がない。
デバッグしなくても必要なことはできると思いますが、元に戻したいと思います。ここにいる誰かがなぜこれが起こっているのか考えられるなら、私に知らせてください。ありがとう。
c - void ポインタと ffcall ライブラリ
私は ffcall (具体的には ffcall の avcall パッケージ) ライブラリを使用して、可変引数関数にパラメーターを動的にプッシュしています。つまり、私たちは持っています
ユーザーから取得した値を使用してこの関数を呼び出します。これを行うには、関数の avcall バージョンを作成します。
今、私が avcall を使用している関数は次のとおりです。
そして、それは次のように使用されます:
しかし、avcall を使用してこの関数から一定量の値を取得したいのですが、この情報を事前に知りません。したがって、void ポインターの配列を作成し、タイプに応じてスペースを malloc するだけだと考えました。
そしてav_read_row
、次のとおりです。
大量のメモリ破損エラーが発生しており、ここで行っていることが気に入らないようです。私がこれをした方法に何か問題があることを見つけることができませんか?現時点では、av_read_row
while ループ内で malloc を解放しようとすると気に入りません。もしあれば、誰かが私が間違っていることを見ることができますか?
ありがとう
c - 概要:malloc.c:3074-このコードでエラーが発生するのはなぜですか
実行時に添付されている以下のCコードでエラーが発生します
malloc(21)のすべての呼び出しで; (下記参照)。誰かが理由を説明できますか?私は考えられるすべてのことを試しましたが、それでも失敗します。
ファイル:summary.c
ファイルmanipulation.c
編集このコードは、問題を示すためにここに表示される簡略化されたバージョンであることを考慮に入れてください。関連性のない部分をすべて削除しました。
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++ ベクトル push_back() は同じ型の別のベクトルを上書きしますか?
この方法で nth_best_parse という名前のクラスを定義しました。
次に、この nth_best_parse のベクトルを 2 つの異なるクラスのメンバーとして宣言しました。
次に、このプログラムを gdb で実行し (ちなみに、Linux Ubuntu 9.04、g++ 4.3.3、GNU gdb 6.8-debian を使用しています)、compute_n_best_parses() の定義の最後にブレークポイントを設定します。私が欲しかったこの関数の正確な呼び出しを見つけてください。私はセグメンテーション違反からさかのぼっていました)。gdb がブレークポイントに達したとき、一連のコマンドを発行したところ、gdb の出力は次のようになりました。
BPCFGParser.cpp の 639 行目は次のようになりました。
これは、ファイルの先頭で次のように定義されたマクロです。
ちなみに、クラス Traversal は次のように定義されています。
したがって、実際には、クラス BPCFGParser のインスタンスのメンバーであるベクトル n_best_pairs_for_traversals に何かをプッシュしています。push_back() コードは、クラス Edge のインスタンスのメンバーであるベクトル n_best_parses を上書きします。どうしてこれが可能になるのでしょうか?
c - C での文字列オーバーフロー検出
メモリ リークの問題を検出するために、DevPartners boundchecker を使用しています。次のような文字列オーバーフローは見つかりませんが、素晴らしい仕事をしています
質問-1: BoundsChecker にこれを検出させる方法はありますか?
質問 2: そのような問題を検出できる他のツールはありますか?