-2

DEBUG モードでは正常に動作するプログラムがありますが、RELEASE モードでは、アクセス違反が原因で未処理の例外が発生します。nullポインターが原因ではないことは確かです。コールスタックは次のとおりです。

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.
4

2 に答える 2

0

何かファンキーです。なぜ argc は 4233952 なのですか? それが単なるデバッガーのアーティファクトではないことを確認できますか?

プロジェクトを再構築することをお勧めします。それでも問題が解決しない場合は、すべてがロードされた後にプログラムをデバッグし、「モジュール」ウィンドウを確認してください。DLL や EXE のリリース バージョンやデバッグ バージョンなど、互換性のないライブラリが混在している可能性があります。

ロードされた CRT ファイル、msvcr90d などに特に注意してください。ロードされたすべての CRT DLL のファイル バージョン情報を調べて、それらがすべて同じバージョンであることを確認します。

于 2011-06-28T21:26:57.097 に答える
0

私が直面している問題は、プログラムが DEBUG CRT DLL からシンボルをロードすることだと思います。アクセス違反が発生するまでに、RELEASE CRT DLL のシンボルは読み込まれません。プログラムに関連するすべてのプロジェクトをチェックしましたが、それらはすべてマルチスレッド DLL (/MD) を使用していますが、まだデバッグ バージョンを使用しています。

于 2011-06-29T17:55:48.263 に答える