2

Boost Asio (1.53.0)を使用して単純な TCP サーバーを作成しました。サーバーは JSON リクエストを受け入れ、boost::property_tree::read_jsonで解析します。

信頼性をテストするために、128 個のスレッドを作成し、継続的にリクエストを送信する単純なアプリケーションを作成しました。

数秒後、サーバーはアクセス違反でクラッシュします。

Unhandled exception at 0x000007FEFD829E5D (KernelBase.dll) in RPC_Server.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.

msvcr110d.dll!__RethrowException(EHExceptionRecord * pThisException) Line 1217
msvcr110d.dll!__CxxCallCatchBlock(_EXCEPTION_RECORD * pExcept) Line 1279
ntdll.dll!0000000077360c21()
RPC_Server.exe!json::json::Parse(std::basic_string<char,std::char_traits<char>,std::allocator<char> > & sJson) Line 28

ここで get の read_json が呼び出されます。

rpc::request json::Parse(std::string sJson)
{
  try {
    std::stringstream ss;
    ss << sJson;
    boost::property_tree::ptree pt;
    boost::property_tree::read_json(ss, pt);
...
}
  • read_json 行をコメントアウトすると、サーバーはすべてを正しく処理します。
  • たとえば、テスト アプリケーションを 1 つのスレッドだけに減らすと、サーバーはすべてを正しく処理および解析します。
4

1 に答える 1