Как выполнить отладку в Quantlib через SWIG из моего модульного теста C#

У меня есть модуль в Quantlib, который работает неправильно, когда я вызываю его из C# через SWIG. Есть ли способ отлаживать Quantlib из моего модульного теста С#?


person A-K    schedule 07.03.2011    source источник
comment
Каков сценарий? G++/моно или MSVC?   -  person lefticus    schedule 07.03.2011
comment
@lefticus Я использую VS 2008, могу использовать VS 2005.   -  person A-K    schedule 07.03.2011


Ответы (1)


Еще никто не ответил, поэтому я предоставлю, что мы делаем в подобных ситуациях при отладке Ruby + SWIG.

Создайте проект Visual Studio, содержащий исходный код C#, сгенерированный SWIG, C++, сгенерированный SWIG, модульный тест C# и остальную часть исходного кода Quantlib.

Я только что просмотрел файлы решения Visual Studio, предоставленные Quantlib, и не вижу целей SWIG, что очень прискорбно, но если у вас есть хотя бы исходный код C++ и вы можете собрать его в режиме отладки, вы можете добраться туда. Сложность заключается в том, что C# Dll, которую вы вызываете, будет ожидать ссылки на определенную C++ DLL в своих вызовах. Возможно, вам придется переместить библиотеку отладки C++ Quantlib в папку Debug проекта C#, чтобы она нашла нужную вам версию.

Как только вы настроите свое решение, создайте все как отладку или rel с символами отладки.

Если на данный момент у вас есть исходный код привязок C# и исходный код Quantlib C++ в одном и том же решении, вы должны иметь возможность установить точку останова в любом месте C# или C++ и иметь возможность пошагово выполнять вызовы от одного к другому.

В нашей ситуации SWIG Ruby мы можем установить точки останова в файле CXX, сгенерированном SWIG, или в исходном коде библиотеки C++, который обернут swig, и пройти через вызовы, сделанные интерпретатором Ruby. Мы можем сделать это, запустив ruby ​​из Visual Studio в качестве запускаемого проекта.

  • Возможно, это ключевой момент. Имейте и DLL, которую вы хотите отлаживать, и приложение, которое загружает вашу DLL (даже если это вызов LoadLibrary, как это было бы из C# или из Ruby). в том же растворе. Затем Visual Studio будет учитывать ваши точки останова в отлаживаемой DLL. Если точки останова не соблюдаются, вам может потребоваться использовать procexp от Microsoft, чтобы увидеть, какая DLL загружена, и не находит ли библиотека C# другую версию библиотеки C++, чем вы хотите.

Я надеюсь, что эта информация поможет.

person lefticus    schedule 08.03.2011