Как получить имена файлов и номера строк в трассировке стека C#, запущенной в edge.js в OSX

В частности, это касается получения номеров строк в трассировке стека при запуске C# под edge.js.

Учитывая этот исходный файл 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

Есть ли способ получить имена файлов и номера строк в трассировке стека вместо :0?

Из командной строки mono должен быть запущен с использованием аргумента --debug, чтобы получить номера строк. Если это так, то этот вопрос может сводиться к "Как передать аргументы в CLR из edge.js?"

Версии: node.js: v0.10.39, mcs / mono: 4.0.4.0, edge.js: 4.0.0

[Edit] Я обнаружил, что вы можете получить аргументы командной строки в mono from edge, установив переменную окружения MONO_ENV_OPTIONS. К сожалению, это не работает с --debug.

1 ответ

Решение

После изучения этого, кажется, что Edge не предоставляет способ активировать отладку во встроенном моно, вам нужно изменить и собрать Edge самостоятельно, чтобы выполнить это. Это быстрый процесс, как только вы это выясните:

1. Установите ребро для вашего проекта обычно с:

npm install edge

Я выполнил шаги по сборке на 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
Другие вопросы по тегам