例外発生時のスタックトレースを作ってみる。

D言語では、Javaなんかのように例外発生時に、どこの関数で例外が発生して、何処の関数を通ってきた。というのが取れません。でも、shinichiro_hさんのreflectionとClassInfo.classInvariantでクラスの関数呼び出し時の一番最初に取得できるので、スタック情報を見て上げれば、どの関数が呼ばれたかの履歴が取れるし、作れるなと思って作ってみました。で、とりあえず出来ました。Windowsオンリーでしか動かないんじゃないかと思いますが、、、。ソースも汚いので綺麗にしたら、公開しようかなと。

しかし、スタックの内容なんて、実装が変れば、当然変ってしまうものだし、危ういことこの上ないです。関数ポインタがうまくとれなければ?が出て終わるんですが、、、。

あとは、ライン情報があればなぁ。dmdの-gオプションをつけるとデバッグ用の情報を埋め込むので、ライン情報も入るはず。デバッガではとまりますから。ってことで、ライン情報も取れるはずです。
でも、PEフォーマットとDebug Information Formatあたりを理解しなければならず、並大抵のことでは作れそうにないなと思いました。

あと、通常の関数はclassInvariantを使っている限り見れないのでなんとかならないかなと。