0

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

有没有办法在堆栈跟踪中获取文件名和行号而不是 <filename unknown>:0 ?

在命令行中,mono 必须使用 --debug 参数运行才能获取行号。如果这里是这种情况,那么这个问题可能归结为“我如何将参数从 edge.js 传递给 CLR?”

版本:node.js:v0.10.39、mcs/mono:4.0.4.0、edge.js:4.0.0

[编辑] 我发现你可以通过设置环境变量 MONO_ENV_OPTIONS 从边缘获取命令行参数。不幸的是,这不适用于 --debug。

4

1 回答 1

1

经过研究,似乎edge没有提供在嵌入式单声道中激活调试的方法,您需要自己修改和构建edge来完成它。但是,一旦您弄清楚了,这是一个快速的过程:

1.正常为您的项目安装边缘:

npm install edge

我确实遵循了在 OSX 上构建的步骤,但这不是必需的。

2.更改node_modules/edge/src/mono/monoembedding.cpp为包含mono-debug.h调用mono_debug_initMonoEmbedding::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
于 2015-12-16T02:08:50.780 回答