Как получить имена файлов и номера строк в трассировке стека 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
Есть ли способ получить имена файлов и номера строк в трассировке стека вместо
Из командной строки 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