2012-09-06 64 views
4

我目前正在使用一個相當老的Borland C++應用程序,它使用ActiveX組件來繪製一些圖形。在應用程序與ActiveX comp的多個窗口。可以隨時打開 - 這些可以顯示相同的圖形(不同的縮放因子等)或不同的圖形。如何調試ActiveX控件(OCX),或使其記錄錯誤?

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

大約每秒10次Borland應用程序獲得了新位置,並找出哪些表單(以及它們的ActiveX)需要了解更新的位置以便繪製它。這已經很長時間了,但是我必須對ActiveX的新版本做一些改變。

大約一年前,我不得不在組件中做一些小的改動,我發現應用程序可能以一種狀態結束,導致組件中出現「索引越界」錯誤。這樣做的結果並不是顯示錯誤或程序終止,而是應用程序開始使用大量內存 - 並且保持非常快的速度。在某個時刻,它停止了,出錯的組件停止顯示任何東西(停止繪製自己)。

現在隨着我所做的最近的更改,我遇到了同樣的問題,其中一個組件似乎出現一個錯誤,該錯誤沒有顯示出來,而是不重繪自己,而且內存使用正在進行-高。在某些PC上,似乎存在訪問衝突 - 這是說錯誤發生在OCX中,但在我開發的個人電腦上,我無法以任何方式獲得此訪問衝突。

此外,我無法確切地發現錯誤發生的時間 - 即是什麼導致了錯誤。我可以連續10次運行相同的設置15分鐘,有時會發生內存使用上升和組件錯誤,其他時間沒有任何反應,並且它在整個持續時間內運行。

因爲它是一個OCX,所以它使用regsvr32進行註冊,因此它不是主應用程序的一部分。因此我不能使用斷點並以這種方式進行調試。

我很確定組件內部發生了一些錯誤,而這些錯誤並未傳遞,所以我看不到它是什麼。

所以有人知道我可以調試嗎?我可以以某種方式使OCX日誌發生任何錯誤,或使其顯示錯誤,或者我能做什麼?

任何幫助將不勝感激 - 一直試圖追查3天的錯誤,現在沒有結果如此。

+0

你可以修改或建立ocx嗎?如果您有ocx的PDB文件,您可以調試它 - 只需將調試器附加到正在運行的進程。 – tenfour

+0

我確實可以修改和構建ocx。我完全不熟悉MFC和OCX,所以我不太清楚如何使用PDB文件並將調試器連接到正在運行的進程? – Knirkegaard

回答

9

基本上你問如何調試一個DLL。 OCX只是一個加載到進程中的DLL文件。這是一個比較寬泛的話題,但我會嘗試給出一個簡短的開始:

在Windows編程的上下文中,DLL/EXE/OCX文件通常被稱爲「模塊」。他們基本上都是一樣的東西。爲了清楚起見,我會在這裏稱它們爲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調用是一個你看不到的黑盒子。

微軟甚至爲Windows DLL提供了PDB文件,如ntdll.dll。必須根據需要下載它們。 Visual Studio可以通過去Tools -> Options -> Debugging -> Symbols自動執行此操作,並且應該有一個選項可以使用Microsoft Symbol Server自動提取缺失的符號文件。

小例子來把你在正確的方向:

比方說,你寫的OCX稱爲myctl.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內寫字板崩潰時,它應該顯示源代碼和所有內容,再次假定它位於可訪問的位置。

+0

非常感謝您提供的信息。我聽說VS可以附加到進程調試DLL的等,但不知道它是如何工作的。得到它與您的幫助一起工作,並找到了錯誤。 再次感謝:) – Knirkegaard

1

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

至少我是這麼想的。

+0

也是我最初的想法,但我確信通過記錄追蹤問題需要太多的時間和精力,並且希望能有更好的方法。 – Knirkegaard

1

如何調試OCX/C++在IE.10 + WIN8 64位+ VS2008
* .build您的OCX在VS2008中,添加OCX CSID標籤到HTML中。
* .Keep TabProcGrowth與中等(不改變!)
* .Setting VS2008 OCX項目調試與命令C:\Program Files (x86)\Internet Explorer\iexplore.exe,Attach = Yes,Debugger Type=Native Only
*。開在Internet瀏覽10形式WIN8任務欄。
*。鍵入Internet Explorer 10的URL中的目標ocx htm文件路徑並按Enter鍵以加載htm。
*。ocx已加載,您需要啓用IE.10 ActiveX模式。
*。當IE10準備好ActiveX模式時,運行您的VS2008 OCX項目,該項目會將IE10附加到您的中斷點。
*。再次刷新IE.10 html以重新加載ocx並開始調試您的ocx源代碼。

+0

我修正了你的格式化...如果可能的話,儘量讓它更具可讀性。謝謝! –

相關問題