簡體   English   中英

如何調試ActiveX控件(OCX)或使其記錄錯誤?

[英]How can I debug an ActiveX control (OCX), or make it log errors?

我目前正在使用一個相當古老的Borland C ++應用程序,它使用ActiveX組件繪制一些圖形。 在應用程序中使用ActiveX comp的多個窗口。 可以隨時打開 - 這些可以顯示相同的圖形(不同的縮放系數等),也可以顯示不同的圖形。

該應用程序用於定位,ActiveX正在繪制並顯示不同單元的位置。

每秒大約10次Borland應用程序獲得一個新位置,並找出哪些形式(及其ActiveX)需要知道更新的位置以便繪制它。 這已經進行了很長時間,但我不得不在ActiveX中為新版本的產品做一些更改。

大約一年前,我不得不對組件進行一些小的更改,並且我發現應用程序可能以某種狀態結束,導致組件中出現“索引越界”錯誤。 結果不是顯示錯誤或程序終止,而是應用程序開始使用大量內存 - 並且繼續快速上升。 在某些時候它停止了,有錯誤的組件只是停止顯示任何東西(停止繪制自己)。

現在我已經做了最近的改變,我遇到了同樣的問題,其中一個組件似乎得到了一個錯誤,沒有顯示,而是它沒有重繪自己,並且內存使用正在變得天高。 在一些PC上,似乎拋出了訪問沖突 - 這就是說錯誤發生在OCX中,但是在我開發的PC上,我無法以任何方式獲得此訪問沖突。

此外,我無法准確追蹤錯誤發生的時間 - 即導致錯誤的原因。 我可以連續10次運行相同的設置15分鍾,有時它會發生內存使用上升和組件錯誤,有時沒有任何反應,它會在整個持續時間內運行。

由於它是OCX,因此使用regsvr32進行注冊,因此代碼不是主應用程序的一部分。 因此我不能使用斷點並以這種方式調試它。

我很確定組件內部發生了一些錯誤,但是沒有傳遞,所以我看不出它是什么。

那么有誰知道如何調試這個? 我可以以某種方式使OCX記錄發生的任何錯誤,或使其顯示錯誤,或者我該怎么辦?

任何幫助將不勝感激 - 一直試圖追蹤錯誤3天,沒有任何結果。

基本上你問的是如何調試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甚至為像ntdll.dll這樣的Windows DLL提供PDB文件。 必須根據需要下載它們。 Visual Studio可以通過轉到Tools -> Options -> Debugging -> Symbols自動執行此Tools -> Options -> Debugging -> Symbols ,應該有一個選項可以使用Microsoft符號服務器自動獲取丟失的符號文件。

一個小例子,讓你朝着正確的方向:

假設您編寫了一個名為myctl.ocx的OCX,它會在添加到Wordpad文檔時崩潰。 調試方法是將調試器附加到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任何內容。 當Wordpad在myctl.ocx內崩潰時,它應該顯示源代碼和所有內容,再次假設它位於可訪問的位置。

將代碼添加到OCX,打開文件並打印正在發生的事情,可能帶有時間戳。 日志內容可能包括執行流程,輸入值,關鍵變量值,重要內部狀態。

至少這就是我接近它的方式。

如何在IE.10 + WIN8 64bit + VS2008中調試OCX / C ++

  • 在vs2008中構建你的ocx,在你的html中添加ocx CSID標簽。
  • 保持TabProcGrowth與中(不改變!!)
  • 設置VS2008 OCX項目使用命令C:\\Program Files (x86)\\Internet Explorer\\iexplore.exe,Attach = Yes,Debugger Type=Native Only
  • 打開Internet Explore 10表單WIN8任務欄。
  • 鍵入Internet Explorer 10的URL中的目標ocx htm文件路徑,然后按Enter鍵加載htm。
  • ocx加載,你需要啟用IE.10 ActiveX模式。
  • 當IE10准備好ActiveX模式時,運行VS2008 OCX項目,將IE10與您的斷點連接起來。
  • 再次刷新IE.10 html以重新加載ocx並開始調試ocx源代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM