Heisenbug使用dll的问题。接下来我该怎么办?

时间:2011-07-21 19:46:53

标签: c++ dll heisenbug

我正在研究一种使用压控振荡器芯片(VCO)来帮助处理信号的系统。该芯片的制造商(ADI公司)提供了一个程序,用于将设置文件加载到VCO上,但我希望能够在总体信号处理控制系统内设置芯片。幸运的是,ADI公司还提供了一个DLL,用于自己与芯片和加载设置文件进行接口。我在Visual C ++ 6.0中编程(我知道的是旧的),我的程序是一个对话框应用程序。

我让系统完美地将设置文件写入卡并读取其状态。然后我决定我需要处理附加多张卡的情况,必须选择一张。 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的所有其他调用。

我无法访问用于构建dll的源代码,我不知道为什么它的函数会在可执行文件中返回垃圾而不是调试器。在调试器中运行和执行之间还有什么区别可能会导致错误?我可以做些什么来搜索这个错误?

2 个答案:

答案 0 :(得分:0)

某些编译器/ IDE在调试版本中为变量添加额外的填充或将它们初始化为0 - 这可以解释您在调试和“正常”执行之间遇到的差异。

可能值得检查的一些事情:
- 你使用正确的通话约定吗? - 如果没有连接设备,你会得到相同的返回值吗? - 你使用正确的返回类型(uint vs int vs long vs ..)?

答案 1 :(得分:0)

在调用函数之前尝试将_GetDeviceCount设置为0;这可能是调试器为你做的。