2011-07-21 27 views
2

我正在使用壓控振盪器芯片(VCO)來幫助處理信號。芯片製造商(Analog Devices)提供了一個程序來將設置文件加載到VCO上,但是我希望能夠從總體信號處理控制系統中設置芯片。幸運的是,ADI公司還提供了一個DLL來與我們自己的芯片和加載設置文件進行交互。我在Visual C++ 6.0編程(我知道老),我的程序是一個對話框應用程序。Heisenbug使用dll的問題。接下來我該做什麼?

我讓系統完美地將安裝文件寫入卡並讀取其狀態。然後我決定,我需要處理附加了多張卡片並且必須選擇一張的情況。該DLL提供了GetDeviceCount(),它返回一個整數。由於某些原因,每次運行該可執行文件時,都會返回15663105(垃圾,我假設)。每當我調試我的代碼,但是該函數返回正確數量的卡。這是我對GetDeviceCount()的調用。

typedef int (__stdcall *GetDeviceCount)(); 

int AD9516_Setup() 
{ 
int NumDevices; 
GetDeviceCount _GetDeviceCount; 
HINSTANCE hInstLibrary = LoadLibrary("AD9516Interface.dll"); 
_GetDeviceCount = (GetDeviceCount)GetProcAddress(hInstLibrary,"GetDeviceCount"); 
NumDevices = _GetDeviceCount(); 
return NumDevices; 
} 

只是要清楚從我用的是所謂的完全一樣,並在執行和調試工作完美的dll所有其他功能。我做了一些研究,發現Heisenbugs的一個常見原因是線程化。我知道在我使用的對話框背後有一些線程,因此我刪除了除函數之外的所有對該函數的調用。我還發現調試器代碼執行速度比可執行代碼慢,我認爲芯片可能沒有足夠的時間來完成每個命令的處理。首先,我嘗試通過插入一個空的for循環來喚起每個芯片函數調用之間的時間,當這些不起作用時,我將所有其他調用註釋掉了。

我無法訪問用於構建dll的源代碼,我不知道爲什麼它的函數會在可執行文件中返回垃圾而不是調試器。在調試器中運行和執行可能會導致錯誤之間存在什麼其他差異?我能做些什麼來尋找這個錯誤?

+0

調試器中的一切總是運行得慢一點,因爲調試工作必須在編譯的代碼中有額外的東西。所以這是預期的。你能準確地發佈垃圾回收的地方嗎?鑑於它總是相同的,我會懷疑它是未初始化的垃圾,但如果可以的話,您可以通過在另一臺計算機上運行它來確認這一點。 –

+3

我不知道它是否是垃圾,但15663105轉換爲0xef0001,它看起來像低字節(或2)中的計數,也可能是高字節中的狀態。我會去檢查設備上的文檔並查看它返回的狀態代碼的類型。 –

+0

您確定函數返回值的正確聲明是「int」,而不是「short」嗎? – 6502

回答

0

某些編譯器/ IDE爲調試版本中的變量添加額外的填充或將它們初始化爲0 - 這可能解釋您在調試與「正常」執行之間遇到的差異。

有些事情可能值得檢查:
- 你使用正確的調用約定嗎?
- 如果沒有設備連接,你會得到相同的返回值嗎?
- 你使用正確的返回類型(uint vs int vs long vs ..)嗎?

+0

我試圖斷開設備(通常有1張卡),返回值減1。這是可疑的,所以我回去,並檢查返回類型,這是一個16位整數不是一個整數。我將返回類型改爲short,現在它工作正常:)有些人在評論中很早就建議了返回類型,但我確定它是正確的。謝謝 – Hammer

0

嘗試在調用該函數之前將_GetDeviceCount設置爲0;這可能是調試器爲你做的。

+0

當我這樣做時,我只是得到一個運行時錯誤。 _GetDeviceCount是一個指向庫中函數的指針,因此將其設置爲0,然後調用它會引發錯誤。這是你的意思嗎? – Hammer

+0

哦!不,在分配前將NumDevices設置爲0。 –

相關問題