这特别是关于在edge.js下运行c#时获取堆栈跟踪中的行号。
鉴于此C#源文件(test.cs)
using System;
using System.Threading.Tasks;
namespace test {
public class Startup {
public async Task<object> Invoke(dynamic input) {
try {
throw new Exception("some error");
} catch(Exception e) {
Console.WriteLine(e);
}
return null;
}
}
}
我使用以下命令构建.dll(和.dll.mdb):
mcs -debug -target:library -out:test.dll test.cs
使用此edge.js脚本运行:
var edge = require('edge');
var myfunc = edge.func({
assemblyFile: __dirname + '/test.dll'
});
myfunc(true, function(err, result) { });
输出中的堆栈跟踪没有文件名或行号:
System.Exception: some error
at test.Startup+<Invoke>c__async0.MoveNext () [0x00000] in <filename unknown>:0
有没有办法在堆栈跟踪中获取文件名和行号而不是&lt; filename unknown&gt;:0?
从命令行,必须使用--debug参数运行mono才能获取行号。如果是这种情况,那么这个问题可以归结为&#34;我如何从edge.js向CLR传递参数?&#34;
版本:node.js:v0.10.39,mcs / mono:4.0.4.0,edge.js:4.0.0
[编辑] 我发现你可以通过设置环境变量MONO_ENV_OPTIONS从边缘获取命令行参数。不幸的是,这与--debug无关。
答案 0 :(得分:1)
经过研究,看起来edge并没有提供一种在嵌入式单声道中激活调试的方法,你需要自己修改和构建边缘来完成它。不过,一旦你搞清楚,这是一个快速的过程:
1。通常使用以下方式为项目安装边缘
npm install edge
我确实按照building on OSX的步骤操作,但没有必要。
2。更改node_modules/edge/src/mono/monoembedding.cpp
以包含mono-debug.h
并在mono_debug_init
内致电MonoEmbedding::Initialize
。该文件应如下所示:
#include <dlfcn.h>
#include <limits.h>
#include <libgen.h>
#include "edge.h"
#include "mono/metadata/mono-debug.h" //This is new
#include "mono/metadata/assembly.h"
#include "mono/metadata/mono-config.h"
#include "mono/jit/jit.h"
MonoAssembly* MonoEmbedding::assembly = NULL;
void MonoEmbedding::Initialize()
{
...
//This is new. Must be called before 'mono_jit_init'
mono_debug_init(MONO_DEBUG_FORMAT_MONO);
mono_config_parse (NULL);
mono_jit_init (fullPath);
...
}
3。来自node_modules/edge/
,使用以下方式构建边缘
node-gyp configure build
您可能会收到与以下内容类似的错误:
Error: Cannot find module 'nan'
在这种情况下运行npm install --save nan
,应该修复它。
4. 再次运行测试。输出现在是:
System.Exception: some error
at test.Startup+<Invoke>c__async0.MoveNext ()
[0x00019] in /Developer/tests/so/test.cs:8