Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何调试未包含的C++代码_C++_Debugging_.net 4.0_Pinvoke_Swig - Fatal编程技术网

如何调试未包含的C++代码

如何调试未包含的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++代码对

我使用的是第三方专有DLL,其源代码对我不可用。不过,我可以使用似乎是使用SWIG 1.3.39自动生成的包装器代码。包装代码由一个C++文件组成,它使用一些描述DLL到DLL和C项目的头文件编译,使PInvoke调用C++包装器DLL。 <>我在项目解决方案中包含了C++项目,但是当我在C++代码中设置断点时,我永远不会到达。当我尝试在C中使用F11,进入C++函数时,我会得到显示程序集。

我有trie解决方案>比例>配置比例,但没有找到任何可以调试非托管/本机代码的选项

编辑

包装器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传递的值实际上是在包装器函数中反映出来的。更新代码以供参考