-5

Delphi CodeGear 2009 を使用して構築されたアプリケーションをデバッグする必要があります。このアプリケーションは、私以外の誰かによって構築されましたが、この人物はもう会社の一員ではありません。

奇妙な問題です。プロジェクトをコード ギアにロードし、実際に動作するはずのソフトウェアを実行すると、エラーが発生します。

$753CB9BC の最初のチャンス例外。例外クラス 「共有メモリ Global\{B40FBC0C-FEBD-11DD-B3EA-FC6656D89593} の作成中にエラーが発生しました (5)」というメッセージの例外。OrderCenter.exe の処理 (836268)

ステップバイステップモードでソフトウェアを実行することさえできません。実行されたアプリケーション自体に入る前に発生するようです。このエラーを修正する方法はまったくわかりません。コードを見て理解して変更することはできますが、Google のドキュメントなしでそのようなエラーを修正する方法はまったくわかりません。あらゆる種類のキーワードの組み合わせを試してしばらくグーグルとSOを閲覧してみましたが、何も出てきません。

これをデバッグするにはどうすればよいですか? どこから探し始めますか?


編集#1

明確にするために、アプリケーションに入る前に例外が発生し、デバッグすることさえできません。スタック トレースをできるだけ早く貼り付けて、クラッシュしている場所を誰もが確認できるようにします。最初にこれを考えていなかったことをお詫びします。

Google で正確なエラー メッセージを検索しましたが、有用なものは見つかりませんでした。いくつかの例を次に示します。

http://www.google.ca/#hl=fr&output=search&sclient=psy-ab&q=エラー+作成+共有+メモリ&oq=エラー+作成+共有+メモリ

http://www.google.ca/#hl=fr&sclient=psy-ab&q=delphi+Error+creating+shared+memory&oq=delphi+Error+creating+shared+memory


編集#2

ある種の初期化手順があったことを特定するために時間を割いてくれた人に感謝します。私はすべてのファイルを検索し、その手順を見つけて、コードがここでクラッシュしていることを発見しました:

if not AlreadyRunning(ProcessName, TFormMain, False, False, True) then

このコードの宣言を調べてみると、二重の初期化を防ぐために、おそらくある種の Mutex であるグローバル共有メモリ オブジェクトを実際に作成しようとしているようです。

私の最初の推測では、ユーザーが 2 つ以上の同じアプリケーションを実行できるようになったことを除けば、コードのこの部分を直接の影響なしに捨てることができるでしょう。

余談ですが、そもそもなぜこれが失敗するのだろうか(Win7、管理者アカウント)

PS:最初にエラーが発生した場所を見つけることができなかった理由は、アプリケーションがデバッグ モードではなくリリース モードであったためです。ファイルのビルド構成の下でエラーに気付くまでに時間がかかり、詳細な UI 検索が必要でした。マネジャー。アプリの初期化部分にブレークポイントを配置しようとするまで、私がリリースモードにあったことを示すものは何もありませんでした...

4

2 に答える 2

15

エラーは、特にプログラムによって発生します。これは、次のメッセージから識別できます。

例外クラス 「共有メモリの作成中にエラーが発生しました グローバル\{B40FBC0C-FEBD-11DD-B3EA-FC6656D89593}」というメッセージの例外 (5)

これには、Delphi プログラムによって発生する例外の特徴がすべて含まれています。16 進数は$ではなく で示され0x、メッセージの最初の単語は標準の Delphi です。この例外を発生させるのはあなたのプログラムだと思います。

まず、例外クラスはException. 私の知る限りでは、RTL や評判の良いサードパーティのライブラリで class の例外が発生するものはありませんException。それは悪い習慣と見なされます。のサブクラスを常に発生させExceptionます。したがって、アプリケーションのコードでこの例外が発生しています。

次に、メッセージは共有メモリの作成エラーを説明し、Global名前空間に名前付きオブジェクトを示します。これはおそらく名前付きファイル マッピング オブジェクトです。

最後に、メッセージには への呼び出しによって取得された Win32 エラー コードが含まれますGetLastError。そのコードは 5 番ERROR_ACCESS_DENIEDです。

したがって、このプログラムは別のプロセスと連携して動作し、通信は共有メモリ (ファイル マッピング) を使用して行われるように見えます。また、そのファイル マッピングのセキュリティは、何らかの理由で正しく設定されていません。

オブジェクトはGlobal名前空間に配置されています。これは、セッション間で共有する必要がある場合に行うことです。そのため、他のプロセスがセッション 0 のサービスに存在する可能性が高いと思われます。おそらく、セッション間アクセスのためにオブジェクトを保護するために必要なセキュリティ属性が正しく指定されていません。

例外を発生させるコードは、次のようになります。

FileMapping := OpenFileMapping(FILE_MAP_READ or FILE_MAP_WRITE, 
  False, PChar(FileMappingName));
if FileMapping=0 then
  raise Exception.CreateFormat(
    'Error creating shared memory %s (%d)',
    [FileMappingName, GetLastError]
  );

提示された証拠から私が言えることはこれだけです。しかし、これで、失敗しているコードを見つけるためにプログラム内で何を検索すればよいかがわかります。あなたに。

于 2013-04-09T19:49:26.713 に答える
0

質問を編集すると履歴がわかりにくくなるため、この回答を投稿しました。コードを見ずに例外メッセージの意味を理解し、ブロックの新しい担当者である OP にそれを説明してくれた David に感謝します。

David の助けを借りて、コードの重複インスタンスの実行を防止するコードを見つけたようです。削除しても、他のペナルティは発生しない可能性がありますが、コードを読み取ることができないため、それを確実に伝えることはできません. また、リリース モードとデバッグ モードの概念は、ネイティブ開発者 (C++ および Delphi) にとっては盲目的に明らかであり、コンパイラやネイティブ コードに慣れていない開発者にとっては、おそらくより微妙であることに注意してください。Delphi アプリケーションを維持するつもりなら、Delphi に関する本を手に入れる価値があるかもしれません。これがあなたの最初のコンパイル済み/ネイティブ言語である場合、そこにはもっと多くのドラゴンがあり、水は非常に速く深くなります。

ほとんどの場合、死にかけているこのコードは、次のいずれかの要素です。

(a) 一般的な Delphi テクニックのクックブックからコピーして貼り付けたもの、または

(b) 元の作成者によって作成されていないコンポーネントまたはクラスの一部

このコードは、たとえば 1998 年に Delphi 5 用に作成されたこのコンポーネント コードを Windows NT に移動したことでバグが発生した可能性があり、Windows 7 または 8 の Delphi XE3 では機能しなくなりました。この現象は Delphi に固有のものではありません。そして「ビット腐敗」と呼ばれます。つまり、環境は少し動くターゲットであり、古いコードはこのように壊れることがよくあります。PHP プログラマーが、Delphi や関連する Win32 API の知識なしにこれを修正するのは、自動車整備士に肝臓の手術をしてもらうようなものです。私はその男にオッズを与えません。

それにもかかわらず、ここに計画があります:

A. コメントアウトします。

B. テストを続行します。

狙撃してごめんね、今は互角だ!;-)

于 2013-04-10T13:58:58.930 に答える