我正在使用Embedded Mono,它的工作效果非常好。主应用程序是C ++,我可以加载程序集,构造对象,调用方法等。
我现在想做的是,能够使用MonoDevelop连接到我的程序,然后能够在Managed(C#)代码中设置断点。经过大量研究,我将通过以下内容 到:
static const char* options[] = {
"--soft-breakpoints",
"--debugger-agent=transport=dt_socket,address=127.0.0.1:10000"
};
mono_jit_parse_options(sizeof(options)/sizeof(char*), (char**)options);
mono_debug_init(MONO_DEBUG_FORMAT_MONO);
进行上述调用后,该应用将连接到MonoDevelop。
在MonoDevelop方面,我设置了env。 var MONODEVELOP_SDB_TEST=y
允许你这样做
使用“运行 - >运行方式 - >自定义命令MonoSoft调试器,它将连接到
应用
这是一个棘手的部分:为了让Run With - >自定义命令MonoSoft Debugger 选择你需要打开一个项目,为此,我只需打开(Debug built)程序集,然后,在Project Options中我添加了一个自定义的“Execute”命令并指向C ++ .exe,并选中“Run on”外部控制台“。
在MonoSoft Debugger对话框中单击“Listen”后,我的应用程序启动,我在Application Output中看到有关我的程序集的消息,但是,如果我打开源文件(C#)并尝试设置断点,转动禁用的颜色,永远不会被击中。我缺少什么,我是否需要调用其他mono_debug函数来通知mono调试我的程序集,是否有某种类似gdb的路径属性来告诉MonoDevelop在哪里查找源代码?
答案 0 :(得分:2)
当我们的应用程序打印堆栈跟踪(Environment.Stacktrace)时,它们是否有源文件和行信息?如果没有,则应检查程序集旁边是否有mdb符号文件。
如果您的托管代码是使用.NET的编译器构建的,那么您将拥有pdb文件,Mono无法加载这些文件。使用pdb2mdb工具将它们转换为mdb文件。
同时检查堆栈跟踪中的文件路径是否与主机上实际源文件的路径匹配。