我正在使用壓控振盪器芯片(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的源代碼,我不知道爲什麼它的函數會在可執行文件中返回垃圾而不是調試器。在調試器中運行和執行可能會導致錯誤之間存在什麼其他差異?我能做些什麼來尋找這個錯誤?
調試器中的一切總是運行得慢一點,因爲調試工作必須在編譯的代碼中有額外的東西。所以這是預期的。你能準確地發佈垃圾回收的地方嗎?鑑於它總是相同的,我會懷疑它是未初始化的垃圾,但如果可以的話,您可以通過在另一臺計算機上運行它來確認這一點。 –
我不知道它是否是垃圾,但15663105轉換爲0xef0001,它看起來像低字節(或2)中的計數,也可能是高字節中的狀態。我會去檢查設備上的文檔並查看它返回的狀態代碼的類型。 –
您確定函數返回值的正確聲明是「int」,而不是「short」嗎? – 6502