Heisenbug问题与使用dll.接下来我要做什么?
Heisenbug issue with using a dll. What do I do next?
我正在研究一个使用电压控制振荡器芯片(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;这可能是调试器为你做的。
- 无论我使用什么,我的输入都会被跳过
- 我提出什么条件才能再加5%的折扣
- 为什么我要从串口读取垃圾?
- 这个编译器错误究竟希望我执行什么?
- 每次我要使用外部资源时,我都会得到:collect2。exe:错误 ld 返回 1 退出状态
- 关于内存泄漏,我有什么不了解的
- mfc CEdit 我应该什么时候进行验证?
- 单元测试类无法在我要测试的同一解决方案中的另一个项目中找到类
- 尝试使用 Qt 库中的 QPixmap 将图像拆分为多个块。关于他的复制方法的工作方式,我有什么不明白的吗?
- 有人可以向我解释什么[](int i){返回i%2 == 0;} 方法
- CUDA我的共享内存代码不起作用,我缺少什么
- 为什么我要尝试在一个if语句中调用两个fucntions,但是在第一个完成后它忽略了另一个功能?(C )
- 3-D平面过滤EVD Lansac ..我要去哪里
- 无论我投入什么,我都会得到相同的答案
- 如何使用 Open MPI 使我的程序更快?我的 Open MPI 程序目前比原来慢,我有什么不明白的?
- 为什么无论我输入什么,我的时循环一直触发
- Heisenbug问题与使用dll.接下来我要做什么?
- 当我把所有的代码放在标题时,我要考虑什么?
- 我要从学习C / C++学习Java:这到底是什么?
- 我要给函数传递什么,才能自动遍历数组