boost, coroutine2 (1.63.0): исключение вызывает сбой Visual Studio на 32-битных окнах

В моем приложении я использую coroutine2 для генерации некоторых объектов, которые мне нужно декодировать из потока. Эти объекты генерируются с использованием сопрограмм. Моя проблема заключается в том, что как только я достигну конца потока и теоретически выдам std :: ios_base :: fail, мое приложение аварийно завершает работу при определенных условиях.

Функция, обеспечивающая эту функцию, реализована в C ++, экспортируется как функция C и вызывается из C #. Все это происходит на 32-битном процессе в Windows 10 x64. К сожалению, он только надежно падает, когда я запускаю тест из C # в режиме отладки БЕЗ встроенного отладчика. Как только я присоединяю нативный отладчик, все работает как положено.

Вот небольшое тестовое приложение для воспроизведения этой проблемы:

Api.h

#pragma once
extern "C" __declspec(dllexport) int __cdecl test();

Api.cpp

#include <iostream>
#include <vector>
#include <sstream>
#include "Api.h"
#define BOOST_COROUTINES2_SOURCE
#include <boost/coroutine2/coroutine.hpp>

int test()
{
using coro_t = boost::coroutines2::coroutine<bool>;

coro_t::pull_type source([](coro_t::push_type& yield) {
std::vector<char> buffer(200300, 0);
std::stringstream stream;
stream.write(buffer.data(), buffer.size());

stream.exceptions(std::ios_base::eofbit | std::ios_base::badbit | std::ios_base::failbit);

try {
std::vector<char> dest(100100, 0);
while (stream.good() && !stream.eof()) {
stream.read(&dest[0], dest.size());
std::cerr << "CORO: read: " << stream.gcount() << std::endl;
}
}
catch (const std::exception& ex) {
std::cerr << "CORO: caught ex: " << ex.what() << std::endl;
}
catch (...) {
std::cerr << "CORO: caught unknown exception." << std::endl;
}
});

std::cout << "SUCCESS" << std::endl;
return 0;
}

C #:

using System;
using System.Runtime.InteropServices;
namespace CoroutinesTest
{
class Program
{
[DllImport("Api.dll", EntryPoint = "test", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
internal static extern Int32 test();

static void Main(string[] args)
{
test();
Console.WriteLine("SUCCESS");
}
}
}

Некоторые детали:

  • Мы используем Visual Studio 2015 14 и динамически связываем среду выполнения C ++.
  • Библиотека тестов статически связывает Boost 1.63.0.
  • Мы также попытались воспроизвести это поведение, вызвав функцию все напрямую из c ++ и из python. Оба теста пока не увенчались успехом.
  • Если вы запустите код c # с помощью CTRL F5 (то есть без отладчика .net), все будет в порядке. Только если вы запустите его с F5 (имеется в виду отладчик .NET), экземпляр Visual Studio потерпит крах. Также убедитесь, что не включили нативный отладчик!
  • Примечание. Если мы не используем исключения в потоке, все будет хорошо. К сожалению, код, декодирующий мои объекты, использует их, и поэтому я не могу этого избежать.

Было бы замечательно, если бы у вас были дополнительные подсказки о том, что может пойти не так, или о решении. Я не совсем уверен, является ли это ошибкой наддува, также может быть отладчиком c #, мешающим надстройке контекста.

Заранее спасибо! С наилучшими пожеланиями, Майкл

0

Решение

Это всего лишь предположение, но в вашей сопрограмме я думаю, что вы должны выдавать логическое значение в свой приемник (названный в вашем коде yield), а код этого не делает.

-1

Другие решения

Других решений пока нет …