Pythonで実装された言語にトレースバック/デバッグ機能を追加する方法

StackOverflow https://stackoverflow.com//questions/9633363

質問

Pythonを使って 'foo'という名前のプログラミング言語を実装しています。 FooのコードはすべてPythonに翻訳され、同じPythonインタプリタでも実行されますので、JitはPythonに翻訳されます。

これはFooのコードの小片です:

function bar(arg1, arg2) {
    while (arg1 > arg2) {
        arg2 += 5;
    }
    return arg2 - arg1;
}
.

これは次のように変換されます。

def _bar(arg1, arg2):
    while arg1 > arg2:
        arg2 += 5
        watchdog.switch()
    watchdog.switch()
    return arg2 - arg1
.

'watchdog'はグリーンレットです(生成されたコードもグリーンレットコンテキストでも実行されています)言語は信頼されていないコードを実行しますので、リソース使用量を監視/制限します。

例で見ることができるように、Pythonコードが生成される前に、ウォッチドッグスイッチを追加し、関数識別子に小さな変更を加えるために解析ツリーに小さな変更が加えられます。

すべての要件を満たすために、Pythonランタイムが例外をスローすると、ユーザーが見るのか、ユーザーのコードトレースバックが表示されるのは、(生成されたPythonコードトレースバックを表示するように) )

ユーザーが以下の内容で 'program.foo'という名前のファイルを作成すると考える:

1  function bar() {
2      throw Exception('Some exception message');
3  }
4
5  function foo() {
6      output('invoking function bar');
7      bar();
8  }
9
10 foo();
.

これは次のように変換されます。

def _bar():
    watchdog.switch()
    raise Exception('Some exception message')

def _foo():
    print 'invoking function bar'
    watchdog.switch()
    _bar()

watchdog.switch()
_foo()
.

その後、 'program.foo'の出力は次のようなものであるべきです:

invoking function bar
Traceback (most recent call last):
  File "program.foo", line 10
    foo();
  File "program.foo", line 7, inside function 'foo'
    bar();
  File "program.foo", line 2, inside function 'bar'
    throw Exception('Some exception message');
Exception: Some exception message
.

それをやるための簡単な方法はありますか? Python Bytecodeのインストルメントを伴わないソリューションは、それがインタプリタの実装の内部にあるため、他に何もない場合は、インストランインストールも実行されます。

役に立ちましたか?

解決

You could decorate each generated Python function with a decorator which record the context (filename, function, line number, etc.) to a global stack. Then you could derive your own Exception class and catch it at the top level of the interpreter. Finally, you print out what you like, using information from the global debug stack.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top