Boost :: Program_Options необработанное исключение из-за нарушения прав доступа - PullRequest
0 голосов
/ 29 июня 2011

У меня есть программа, которая отлично работает в режиме отладки, но в режиме RELEASE я получаю необработанное исключение из-за нарушения прав доступа. Я уверен, что это не из-за нулевых указателей. Вот стек вызовов:

msvcr90d.dll!memchr(unsigned char * buf=0x0000002c, unsigned char chr='', unsigned long cnt=1243588)  Line 80         Asm
msvcp90d.dll!std::char_traits<char>::find(const char * _First=0x72656d6f, unsigned int _Count=15, const char & _Ch=',')  Line 590 + 0x15 bytes     C++
msvcp90d.dll!std::basic_string<char,std::char_traits<char>,std::_DebugHeapAllocator<char> >::find(const char * _Ptr=0x0012f9e4, unsigned int _Off=0, unsigned int _Count=1)  Line 1796 + 0x2d bytes  C++
Program.exe!boost::program_options::option_description::set_name()  + 0x61 bytes   C++
Program.exe!boost::program_options::option_description::option_description()  + 0x90 bytes C++
Program.exe!boost::program_options::options_description_easy_init::operator()()  + 0x58 bytes           C++
Program.exe!CommandLineInput(int count=2, char * * vector=0x003d3360)  Line 191 + 0xac bytes          C++
Program.exe!main(int argc=4233952, char * * argv=0x00000002)  Line 65535        C++
Program.exe!__tmainCRTStartup()  Line 582 + 0x17 bytes            C

Код:

namespace po = boost::program_options;

int _tmain(int argc, _TCHAR* argv[])
{
        try
        {
            CommandInput (argc, argv); //get command line input
        }
        catch ( std::exception e )
        {
            std::cout << "WARNING: Exception is thrown" << std::endl;
            return 0;
        }
}

void CommandInput (int count, _TCHAR* vector[])
{
        po::options_description desc("Available Parameters");
        std::cout << "\n";
        desc.add_options()
            ("option1", po::value<std::string>(), "description1")
            ("option2", po::value<std::string>(), "description2")
            ("option3", po::value<std::string>(), "description3");

/*
The code breaks at the above line
*/
}

Исключение гласит:

Unhandled exception at 0x1026f09b (msvcr90d.dll) in Program.exe: 0xC0000005: Access violation reading location 0x72656d6f.

Ответы [ 2 ]

0 голосов
/ 29 июня 2011

Думаю, проблема в том, что моя программа загружает символы из DLL-библиотеки DEBUG CRT.К тому времени, когда происходит нарушение доступа, символы из библиотеки RELEASE CRT не загружаются.Я проверил все проекты, участвующие в моей программе, и все они используют многопоточную DLL (/ MD), и все же она все еще использует его отладочную версию.

0 голосов
/ 29 июня 2011

Что-то в стиле фанк. Почему argc 4233952? Можете ли вы проверить, что это не просто артефакт отладчика?

Я предлагаю вам пересобрать свой проект, и если это не поможет, то после того, как все загрузится, отладьте программу и посмотрите в окно «модулей». Вы можете смешивать несовместимые библиотеки, например, выпуск и отладка версий DLL / EXE.

Обратите особое внимание на загруженные файлы CRT, msvcr90d и т. Д. Посмотрите информацию о версии файла всех загруженных библиотек DLL CRT и убедитесь, что они имеют одинаковую версию.

...