Отладчик не переходит в машинный код при отладке статической библиотеки, заключенной в C ++ / CLI DLL.

В приложении C # я имею в виду собственную статическую библиотеку C, которую я заключил в DLL C ++ / CLI. Я выбрал статическую библиотеку вместо библиотеки DLL, потому что у меня есть другие ограничения, связанные с процессом выпуска приложения для пользователя. Среди множества тем, доступных на этом форуме, я нашел следующую реализацию.

Главный :

{
  MyCLRDLL test = new MyCLRDLL();
  if(test.go()) Console.WriteLine("Hello, wrld");
}

В проекте DLL файл MyCLRDLL.hpp

#include "MyNativeLib.h"
#pragma comment(lib, "MyNativeLib.lib")
namespace InteropTest {
public ref class MyCLRDLL
{
  CMyNativeLib* mInt ;
  public:
    MyCLRDLL()  { mInt = CMyNativeLib_New() ;} ;
    ~MyCLRDLL() { CMyNativeLib_Delete(mInt) ;} ;
    bool go() { return mInt->areYouThere()  ;} ;
};
}

А в собственном проекте MyNativeLib.h

namespace InteropTest
{
class __declspec(dllexport) CMyNativeLib
{
public:
  CMyNativeLib() {};
    ~CMyNativeLib(){};
  bool areYouThere() ;
} ;
extern "C" __declspec(dllexport) CMyNativeLib* CMyNativeLib_New();
extern "C" __declspec(dllexport) void CMyNativeLib_Delete(CMyNativeLib* pLib);
}

и MyNativeLib.cpp

#include "MyNativeLib.h"
namespace InteropTest {
extern "C" __declspec(dllexport) CMyNativeLib* CMyNativeLib_New(){return new CMyNativeLib() ;}
extern "C" __declspec(dllexport) void CMyNativeLib_Delete(CMyNativeLib* pLib){delete pLib;}
bool CMyNativeLib::areYouThere() { return true ; }
}

Отладчик не переходит к функции mInt-> areYouThere (). Почему это так? Точки останова в родной части тоже не отлавливаются.

Символы загружаются для MyCLRDLL, «Включить отладку неуправляемого кода» активен в проекте C #, «Тип отладки / отладчика» установлен на Смешанный для обоих проектов C, а в общих параметрах наиболее важные вещи кажутся отмеченными.

Означает ли это, что файл MyCLRDLL.pdb не содержит отладочной информации из кода библиотеки? Как проверить?

(возможен тот же вопрос, что и оставшийся без ответа Отладка неуправляемого C ++ статическая библиотека, включенная в .dll CLR)


person Community    schedule 26.03.2014    source источник
comment
Это сделано намеренно, вы не можете за один шаг перейти от управляемого кода к неуправляемому. Вы должны установить точку останова в собственном коде. И, конечно же, не забудьте включить отладку неуправляемого кода.   -  person Hans Passant    schedule 26.03.2014
comment
Хорошо, но когда я устанавливаю точку останова на машинном коде (функция @ areYouThere в примере), он не останавливается, даже если включена неуправляемая отладка кода. Вы пробовали этот конкретный пример?   -  person    schedule 27.03.2014
comment
На самом деле вы можете перейти в неуправляемый код dll (C ++) из управляемого exe (C #), по крайней мере, в VS2013, поэтому мне интересно, что статическая библиотека - это prb.   -  person Fernando Gonzalez Sanchez    schedule 29.04.2015
comment
Наконец-то перешел на VS2013. Я знаю смешанный режим отладки с включенными параметрами ›Отладка› Общие ›Режим совместимости.   -  person    schedule 14.07.2015


Ответы (1)


Я пробовал ту же настройку, что и у вас. Проект C # exe со ссылкой на проект .dll с поддержкой CLR, который имеет ссылку на .lib с чистым кодом Native C ++.

Прежде всего, в свойствах исполняемого проекта необходимо включить отладку в собственном коде на вкладке «Отладка». Затем вы не сможете работать с подключенным отладчиком, поскольку он не будет загружать символы для собственной части CLR. Мне удалось запустить без подключенного отладчика, а затем установить для проекта CLR значение Startup Project. После этого вы должны присоединиться к процессу с помощью CTRL + ALT + P, указав собственный код в Attach to :. Это сработало для меня.

person Alin Leon    schedule 29.08.2020