如何调试未包含的C++代码
我使用的是第三方专有DLL,其源代码对我不可用。不过,我可以使用似乎是使用SWIG 1.3.39自动生成的包装器代码。包装代码由一个C++文件组成,它使用一些描述DLL到DLL和C项目的头文件编译,使PInvoke调用C++包装器DLL。 <>我在项目解决方案中包含了C++项目,但是当我在C++代码中设置断点时,我永远不会到达。当我尝试在C中使用F11,进入C++函数时,我会得到显示程序集。 我有trie解决方案>比例>配置比例,但没有找到任何可以调试非托管/本机代码的选项 编辑如何调试未包含的C++代码,c++,debugging,.net-4.0,pinvoke,swig,C++,Debugging,.net 4.0,Pinvoke,Swig,我使用的是第三方专有DLL,其源代码对我不可用。不过,我可以使用似乎是使用SWIG 1.3.39自动生成的包装器代码。包装代码由一个C++文件组成,它使用一些描述DLL到DLL和C项目的头文件编译,使PInvoke调用C++包装器DLL。 我在项目解决方案中包含了C++项目,但是当我在C++代码中设置断点时,我永远不会到达。当我尝试在C中使用F11,进入C++函数时,我会得到显示程序集。 我有trie解决方案>比例>配置比例,但没有找到任何可以调试非托管/本机代码的选项 编辑 包装器C++代码对
包装器C++代码对我来说是可用的,我需要看到我从C传递的值实际上传递给C代码。
// In one file of the C# wrapper:
public string GetKey()
{
// swigCPtr is a HandleRef to an object already created
string ret = csWrapperPINVOKE.mdMUHybrid_GetKey(swigCPtr);
return ret;
}
// In the csWrapperPINVOKE class in another file in the C# wrapper:
[DllImport("csWrapper.dll", EntryPoint="CSharp_mdMUHybrid_GetKey")]
public static extern StringBuilder mdMUHybrid_GetKey(HandleRef jarg1);
<>和C++包装的C++代码。< /P>
SWIGEXPORT char * SWIGSTDCALL CSharp_mdMUHybrid_GetKey(void * jarg1) {
char * jresult ;
mdMUHybrid *arg1 = (mdMUHybrid *) 0 ;
char *result = 0 ;
arg1 = (mdMUHybrid *)jarg1;
result = (char *)(arg1)->GetKey();
jresult = SWIG_csharp_string_callback((const char *)result);
return jresult;
}
现在,我正试图通过使用cswrapperppinvoke.mdMUHybrid_GetKeyswigCPtr从C包装器传递swigCPtr
SWIGEXPORT char * SWIGSTDCALL CSharp_mdMUHybrid_GetKey(void * jarg1) {
char * jresult ;
mdMUHybrid *arg1 = (mdMUHybrid *) 0 ;
char *result = 0 ;
arg1 = (mdMUHybrid *)jarg1;
result = (char *)(arg1)->GetKey();
jresult = SWIG_csharp_string_callback((const char *)result);
return jresult;
}
现在我想看看jarg1是否从swigCPtr获得了值
SWIGEXPORT char * SWIGSTDCALL CSharp_mdMUHybrid_GetKey(void * jarg1) {
char * jresult ;
mdMUHybrid *arg1 = (mdMUHybrid *) 0 ;
char *result = 0 ;
arg1 = (mdMUHybrid *)jarg1;
result = (char *)(arg1)->GetKey();
jresult = SWIG_csharp_string_callback((const char *)result);
return jresult;
}
当您有一个托管exe并希望调试它使用的本机DLL时,您需要告诉调试器这一点。不要使用自动调试器类型,默认情况是什么。使用混合instaed 自动将识别托管exe并允许托管调试。这不是调试本地C++代码所需的。
您可以在“项目属性”的“调试”部分找到调试器类型设置。当您有托管exe并希望调试它使用的本机DLL时,您需要告诉调试器这一点。不要使用自动调试器类型,默认情况是什么。使用混合instaed 自动将识别托管exe并允许托管调试。这不是调试本地C++代码所需的。
您可以在项目属性的调试部分找到调试器类型设置。如果没有本机代码的源代码,那么调试本机代码没有多大意义。除了机器代码,没什么可看的,你也无法解决任何问题。请与供应商联系以获得支持。@ HSPSPANT,我有C++包装代码,我想看到从C传递的值实际上是在包装器函数中反映出来的。更新代码以供参考如果您没有本机代码的源代码,那么调试本机代码没有多大意义。除了机器代码,没什么可看的,你也无法解决任何问题。请与供应商联系以获得支持。@ HSPSPANT,我有C++包装代码,我想看到从C传递的值实际上是在包装器函数中反映出来的。更新代码以供参考