2011-06-28 25 views
-2

DEBUGモードで正常に動作するプログラムがありますが、RELEASEモードではアクセス違反のために処理されない例外が発生します。私はそれがnullポインタのためではないと確信しています。ここでは、コールスタックです:Boost :: Program_Optionsアクセス違反による処理されない例外

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

コードの表示はどうですか? – Mat

+0

問題は仕事に関連しているので、私はコードを投稿することを嫌っていました。しかし今、実際のコードのようなモックコードを挿入するために投稿を編集しました。 – Dan

答えて

0

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

+0

私は問題を発見しました。私のプロジェクトのプロパティページ( "libboost_regex-vc90-mt-gd-1_42.lib"が原因でした)のBoostライブラリをデバッグするためにリンクしていたようです。私はそれをProperties-> Linker-> Input-> Additional Dependenciesに移動して修正し、ライブラリ名をリリースバージョンを指すように変更しました。 – Dan

0

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

あなたのプロジェクトを再構築し、それが修正されない場合は、すべてがロードされた後にプログラムをデバッグし、 "modules"ウィンドウを見てください。互換性のないライブラリを混在させている可能性があります。 DLLの/ EXEのバージョンをリリースし、デバッグします。

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

+0

こんにちはデビッド、私はあなたが "デバッガの人工物"とはどういう意味か分かりません。これを明確にすることはできますか?また、ロードされたモジュールはシステムDLLだから、DEBUGとRELEASE DLLを混在させることに問題はないとは思わない。 CRT DLLのバージョン番号は同じでしたが、私は何か怪しいものを見つけたと思います。私のプログラム(RELEASEで実行中)は、 "x86_Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_597c3456"フォルダにあるDEBUG CRT DLLのシンボルを読み込みましたが、CRT DLLのシンボルは "x86_Microsoft.VC90"にはありません。 CRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_597c3456 "フォルダにあります。 – Dan

+0

また、argvは値0x00000002を持っています... 2人がスワップしたように見えますか? 2のargcと0x00409AE0のargvははるかに意味があります。 – qid

+0

これは興味深い観察です。ただし、いずれかのパラメータが使用される前にアクセス違反エラーが発生するため、問題の原因とは思われません(desc.add_options()行で破損します)。 – Dan

関連する問題