gpt4 book ai didi

c++ - 使用 dll 的 Heisenbug 问题。接下来我该做什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:01:05 27 4
gpt4 key购买 nike

我正在开发一个使用压控振荡器芯片 (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 中的所有其他函数都是这样调用的,并且在可执行文件和调试器中完美运行。我做了一些研究,发现 Heisenbugs 的一个常见原因是线程。我知道我正在使用的对话框在幕后有一些线程,所以我删除了对函数的所有调用,除了一个。我还发现调试器代码的执行速度比可执行代码慢,我认为芯片可能没有足够的时间来完成每个命令的处理。首先,我尝试通过插入一个空的 for 循环来占用每个芯片函数调用之间的时间,当这不起作用时,我注释掉了对 DLL 的所有其他调用。

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

最佳答案

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

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

关于c++ - 使用 dll 的 Heisenbug 问题。接下来我该做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6781848/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com