如何在OSX上的edge.js中运行的c#堆栈跟踪中获取文件名和行号

时间:2015-12-11 23:40:34

标签: c# node.js macos mono edge.js

这特别是关于在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无关。

1 个答案:

答案 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