Heisenbug проблема с использованием DLL. Что мне делать дальше? - PullRequest
2 голосов
/ 21 июля 2011

Я работаю в системе, в которой используется чип генератора напряжения (VCO) для обработки сигнала.Производители чипа (Analog Devices) предоставляют программу для загрузки файлов настроек в ГУН, но я хочу иметь возможность настроить чип из всеобъемлющей системы управления обработкой сигналов.К счастью, 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, которую я использовал, называется именно так и прекрасно работает в исполняемом файле и отладчике.Я провел некоторое исследование и выяснил, что частой причиной Гейзенбагов является многопоточность.Я знаю, что в диалоговых окнах, которые я использую, есть некоторая поточность, поэтому я удалил все свои вызовы функции, кроме одного.Я также обнаружил, что код отладчика выполняется медленнее, чем исполняемый код, и я подумал, что у чипа может не хватить времени для завершения обработки каждой команды.Сначала я попытался занять время между каждым вызовом функции чипа, вставив пустой цикл for, и когда это не сработало, я закомментировал все остальные вызовы в dll.

У меня нет доступа к исходному коду, используемому дляпостроить DLL, и я понятия не имею, почему его функция будет возвращать мусор в исполняемый файл, а не отладчик.Какие другие различия существуют между выполнением в отладчике и выполнением, которые могут вызвать ошибку?Что еще я могу сделать, чтобы найти эту ошибку?

Ответы [ 2 ]

0 голосов
/ 22 июля 2011

Попробуйте установить _GetDeviceCount в 0 перед вызовом функции; это может быть то, что отладчик делает для вас.

0 голосов
/ 21 июля 2011

Некоторые компиляторы / IDE добавляют дополнительные отступы к переменным в отладочных сборках или инициализируют их в 0 - это может объяснить различия, которые вы встречаете между отладкой и "нормальным" выполнением.

Некоторые вещи, которые, возможно, стоит проверить:
- используете ли вы правильное соглашение о вызовах?
- получаете ли вы то же возвращаемое значение, если ни одно устройство не подключено?
- вы используетеправильный тип возврата (uint против int против long против ..)?

...