Heisenbug问题与使用dll.接下来我要做什么?

Heisenbug issue with using a dll. What do I do next?

本文关键字:我要 什么 接下来 dll 问题 Heisenbug      更新时间:2023-10-16

我正在研究一个使用电压控制振荡器芯片(VCO)来帮助处理信号的系统。芯片制造商(Analog Devices)提供了一个程序来将设置文件加载到VCO上,但我希望能够从总体信号处理控制系统中设置芯片。幸运的是,Analog Devices还提供了一个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中的其他函数都是这样调用的,并且在可执行文件和调试器中完美地工作。我做了一些研究,发现海森堡bug的一个常见原因是穿线。我知道在我使用的对话框背后有一些线程,所以我删除了所有对函数的调用,除了一个。我还发现调试器代码执行速度比可执行代码慢,我认为芯片可能没有足够的时间来完成每个命令的处理。首先,我试图通过插入一个空的for循环来占用每个芯片函数调用之间的时间,当这不起作用时,我注释掉了对DLL的所有其他调用。

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

一些编译器/ide在调试构建时为变量添加额外的填充或将其初始化为0 -这可能解释了您在调试和"正常"执行之间遇到的差异。

一些可能值得检查的东西:
-你是否使用了正确的通话习惯?
-如果没有设备连接,您是否获得相同的返回值?
-你是否使用正确的返回类型(int vs int vs long vs ..)?

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