5

私は現在、ActiveXコンポーネントを使用してグラフィックを描画しているかなり古いBorlandC++アプリケーションを使用しています。アプリケーションでは、ActiveXcompを使用した複数のウィンドウ。いつでも開くことができます-これらは同じグラフィック(異なるズーム率など)または異なるグラフィックを表示できます。

アプリケーションはポジショニング用であり、ActiveXはさまざまなユニットの位置を描画および表示しています。

1秒間に約10回、Borlandアプリケーションが新しい位置を取得し、それを描画するために更新された位置について知る必要があるフォーム(およびそのActiveX)を見つけます。これは長い間うまくいっていますが、製品の新しいバージョンのためにActiveXでかなりの変更を加える必要がありました。

約1年前、コンポーネントにもいくつかの小さな変更を加える必要がありましたが、アプリケーションが状態で終了し、コンポーネントで「範囲外のインデックス」エラーが発生する可能性があることがわかりました。この結果、エラーが表示されたり、プログラムが終了したりすることはありませんでしたが、代わりにアプリケーションが大量のメモリを使用し始め、非常に高速に起動し続けました。ある時点で停止し、エラーが発生したコンポーネントは単に何かを表示しなくなりました(描画自体を停止しました)。

最近行った変更で、コンポーネントの1つにエラーが発生し、表示されず、代わりにそれ自体が再描画されず、メモリ使用量が非常に高くなるという同じ問題が発生します。一部のPCでは、アクセス違反がスローされているように見えます。これは、エラーがOCXで発生したことを示していますが、私が開発したPCでは、このアクセス違反を取得できません。

また、エラーがいつ発生したか、つまりエラーの原因を正確に追跡することもできません。同じセットアップを15分間連続して10回実行できます。メモリ使用量が増えてコンポーネントのバグが発生する場合もあれば、何も起こらず、全期間にわたって正常に実行される場合もあります。

OCXであるため、zippy32を使用して登録されているため、コード的にはメインアプリケーションの一部ではありません。したがって、ブレークポイントを使用してそのようにデバッグすることはできません。

コンポーネント内で何らかのエラーが発生していると確信していますが、これは渡されないため、それが何であるかがわかりません。

だから誰かが私がこれをデバッグする方法を知っていますか?どういうわけか、発生したエラーをOCXにログに記録させたり、エラーを表示させたりできますか、それとも何ができますか?

どんな助けでも大歓迎です-今まで3日間エラーを追跡しようとしましたが、結果はありませんでした。

4

3 に答える 3

11

基本的に、DLLをデバッグする方法を尋ねています。OCXは、プロセスにロードされる単なるDLLファイルです。これはやや広いトピックですが、簡単なスタートを切ります。

DLL / EXE / OCXファイルは、通常、Windowsプログラミングのコンテキストでは「モジュール」と呼ばれます。それらはすべて基本的に同じものです。わかりやすくするために、ここではそれらをDLLと呼びます。

デバッガー(Visual StudioとBorlandはどちらもデバッガーでありIDEでもあります)は、プロセスに寄生虫のように「接続」し、ブレークポイントの設定、プロセスメモリの読み取り、スタックトレースの表示などを実行できます。すべてのメモリを表示/操作できます。 &すべてのDLLを含むそのプロセスのリソース。

DLLには、デバッグビルドであっても、デバッガーに役立つ情報はあまり含まれていません。基本的にはバイナリマシンコードが含まれているだけで、デバッガーを使用してDLL呼び出しにステップインすると、元のソースコードではなく、アセンブリコードのみが表示されます。関数はメモリ内の単なるアドレスであり、ローカル変数は表示されません。スタックメモリにいくつかのポインタを取得するだけです。

PDBファイル(「プログラムデータベース」)には、メモリ内のアドレスをソースコードの行、ローカル変数、データ型、関数署名などにマッピングするなど、デバッガーが実行するためのすべての追加情報とメタデータが含まれています。この情報は「デバッグシンボル」と呼ばれます。または単に「シンボル」。Visual StudioがDLLを構築すると、対応するPDBファイルが出力されます。デバッガーでソースコードをステップスルーし、ローカル変数を表示し、ウォッチウィンドウでデータ型を適切に表示するすべての魔法を可能にするのはこのPDBファイルです。

Visual Studioのデバッガーがプロセスに接続されていて、DLLが読み込まれていることを確認すると、対応するPDBファイルを検索します。これは多くの場所で検索されます。最も単純な場所はDLLと同じフォルダーにあります。したがって、をロードした場合C:\something\myctl.ocxは、を検索しC:\something\myctl.pdbます。見つかった場合はそれを使用し、豊富なデバッガサポートを使用してDLLをデバッグできます。それが見つからない場合、あなたは今いる場所になります-DLL呼び出しはあなたが見ることができないブラックボックスです。

Microsoftは、のようなWindowsDLL用のPDBファイルも提供していますntdll.dll。必要に応じてダウンロードする必要があります。Visual Studioはに移動することでこれを自動的に行うことができTools -> Options -> Debugging -> Symbols、MicrosoftSymbolServersを使用して不足しているシンボルファイルを自動的にフェッチするオプションがあるはずです。

あなたを正しい方向に導くための小さな例:

myctl.ocxワードパッドドキュメントに追加するとクラッシュするというOCXを作成したとします。これをデバッグする方法は、デバッガーをに接続することwordpad.exeです。Visual Studioでは、それはDebug -> Attach to Process私が信じていることです。取り付けられている場合は、出力ウィンドウでも確認できます。

'wordpad.exe': Loaded 'C:\Program Files\Windows NT\Accessories\wordpad.exe', Symbols loaded (source information stripped).
'wordpad.exe': Loaded 'C:\Windows\System32\ntdll.dll', Symbols loaded (source information stripped).
'wordpad.exe': Loaded 'C:\Windows\System32\kernel32.dll', Symbols loaded (source information stripped).
'wordpad.exe': Loaded 'C:\Windows\System32\KernelBase.dll', Symbols loaded (source information stripped).
...

Visual StudioがPDBファイル(シンボルファイル)をロードする方法を確認できます。これらのファイルには、これらのファイルに関する追加情報が少し含まれています。ロードmyctl.ocxすると、その行も表示されます。アクセス可能な場合myctl.pdbは、それもロードされます。

'wordpad.exe': Loaded 'C:\something\myctl.ocx', Symbols loaded.

myctl.ocxこれにより、ソースコードやすべてのものを使って何でもデバッグできます。ワードパッドが内部でクラッシュmyctl.ocxすると、ソースコードとすべてが表示されます。これも、アクセス可能な場所にあると想定しています。

于 2012-09-06T10:53:15.820 に答える
1

OCXにコードを追加して、ファイルを開き、発生していることを、おそらくタイムスタンプとともに出力します。ログの内容には、実行フロー、入力値、重要な変数値、重要な内部状態が含まれる場合があります。

少なくともそれが私がそれにアプローチする方法です。

于 2012-09-06T10:08:49.407 に答える
1

IE.10 +WIN864ビット+VS2008でOCX/C++をデバッグする方法

  • vs2008でocxをビルドし、htmlにocxCSIDタグを追加します。
  • TabProcGrowthをMediumのままにします(変更されません!!)
  • コマンドを使用したVS2008OCXプロジェクトのデバッグの設定C:\Program Files (x86)\Internet Explorer\iexplore.exe,Attach = Yes,Debugger Type=Native Only
  • InternetExplore10フォームWIN8タスクバーを開きます。
  • Internet Explorer10のURLにターゲットのocxhtmファイルパスを入力し、Enterキーを押してhtmをロードします。
  • ocxがロードされ、IE.10ActiveXモードを有効にする必要があります。
  • IE10がActiveXモードに対応している場合は、IE10をブレークポイントに接続するVS2008OCXプロジェクトを実行します。
  • IE.10 htmlを再度更新して、ocxをリロードし、ocxソースコードのデバッグを開始します。
于 2014-04-26T23:04:11.140 に答える