Я пытаюсь запустить самую простую программу с крипто-библиотекой Botan. Я использую Botan 1.10 32bit. Я получил двоичные файлы с их установщиком на Windows 7. IDE — Visual Studio 2012.
Я связал свой проект с botan.lib, но программа сообщает об отсутствии botan.dll при запуске, поэтому я предполагаю, что lib просто ссылается на dll. Поэтому я положил botan.dll в папку отладки.
Теперь к проблеме.
#include <iostream>
#include <botan/botan.h>
using namespace Botan;
using namespace std;
int main(int argc, char* argv[]) {
try {
cout << "d1";
LibraryInitializer init; //exception thrown here
}
catch(exception& e) {
cout << "Exception caught: " << e.what() << std::endl;
}
cout << "d2";
return 0;
}
Intellisense обнаруживает все в порядке. Когда я пытаюсь отладить, я получаю:
Исключение первого шанса в 0x6A1F2AA0 (botan.dll) в rsa.exe:
0xC0000005: Место чтения нарушения доступа 0x00310000. Неизвестное
исключение в 0x6A1F2AA0 (botan.dll) в rsa.exe: 0xC0000005: доступ
нарушение чтения местоположения 0x00310000.
Кажется, что исключение выдается внутри botan.dll, и я не могу поймать его на моей стороне. Я не могу идти дальше отсюда.
Я что-то неправильно сделал, ссылаясь на библиотеку, или есть какая-то другая проблема? Помощь приветствуется.
Чтобы расширить мой комментарий:
Если ваша программа дает сбой даже при выпускной сборке вашей программы, вам придется скачать исходный код и собрать его самостоятельно (для настройки сборки необходим python).
Если сборка релиза не дает сбоя, вы можете отключить /RTCs Stack Frames
проверка времени выполнения в вашем C++/Code Generation
настройки проекта для вашей отладочной сборки, которая, по-видимому, вызывает сбой. Просто измените настройку с Both
в /RTCu Uninitialized Variables
или вообще отключить, установив Default
,
Поскольку это обходной путь, а не решение, вам следует подумать о сборке ботаника самостоятельно и создать как релизную, так и отладочную версии (тогда вы можете ссылаться на отладочную версию в
Ваша отладочная сборка и оставьте проверки во время выполнения отладки такими, какие они есть.
Обратитесь к документация о том, как его построить (вам понадобится питон запустить конфигурацию):
После создания версии выпуска (по умолчанию) скопируйте следующие файлы в другой каталог (например, C:\Botan\release\
) или они будут перезаписаны при сборке отладочной версии:
Теперь снова запустите configure, на этот раз добавьте --enable-debug
опция:
> python configure.py --cc=msvc --enable-debug
и построить его снова. На этот раз скопируйте файлы (перечисленные выше) в C:\Botan\debug\
,
Сконфигурируйте ваш проект для связи с библиотекой в каталоге отладки для сборок отладки и той, что находится в каталоге выпуска для сборок выпуска.
Наконец, убедитесь, что ваша программа загружает соответствующую DLL при запуске.
Используемые вами двоичные файлы, вероятно, предназначены для режима выпуска. Я попытался связать в режиме отладки и получил нарушение доступа, затем я переключился в режим выпуска, и все работало нормально. Я также не уверен, что бинарные файлы нацелены на VC110. Вы можете скачать исходный код и попробовать собрать его с вашими предпочтительными конфигурациями.
Поскольку это Windows, вы никогда не увидите исключение C ++, пересекающее границы модуля. Следовательно, ваша попытка поймать исключение C ++ не сможет распознать это. Если вы хотите заполучить нарушение доступа, вам нужно будет использовать Структурированная обработка исключений вместо.
Чтобы выяснить, почему происходит сбой .dll, вы должны настроить Visual Studio для взлома отладчика при возникновении нарушения прав доступа. Идти к отлаживать -> Исключения и отметьте Метательное флажок для c0000005 нарушение прав доступа под Win32 Исключения. Попав в отладчик, вы можете загрузить символы отладки (при условии, что они доступны). Стек вызовов и параметры должны дать вам довольно хорошее представление о том, почему он не работает.
Поскольку исходный код, по-видимому, доступен, вы также можете скомпилировать Debug .dll самостоятельно. Это будет как производить правильные символы отладки, так и включать отладку на уровне исходного кода сбоя. Это, вероятно, даст вам всю необходимую информацию для диагностики проблемы под рукой.