Pebble Coding

ソフトウェアエンジニアによるIT技術、数学の備忘録

printfによるデバッグ(Objective-C/VisualC++/Ruby/Python/Go/JavaScript/Java)

私がデバッグする際はprintfなどでデバッグ情報をコンソールに出力し、
止めたいところではassert()を埋め込んでおきます。

Objective-Cでは、以下のようなデバッグ出力をマクロを使います。

#define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)

PRETTY_FUNCTIONというのはNSLog関数が呼び出された関数名が埋め込まれ、
LINEというのはソースファイル中のNSLog関数のある行番号が埋め込まれます。
また可変数引数を渡せるというのも魅力です。
VisualC++環境でも少なくとも、ソースファイル名が埋め込まれるFILE
ソースファイルの行番号が埋め込まれるLINEがありますので、同じ機能を利用できます。
さて、最近の言語では、この機能はあるのでしょうか?調べてみました。

まずはRuby
http://magazine.rubyist.net/?0031-BackTrace)
上記サイトによると、そのものズバリのものはないようですね。
スタック情報に入っているので、そこから取り出す関数を書いてそれを使うようです。
正直いまいち。。

次はPython
http://stackoverflow.com/questions/8759359/equivalent-of-func-from-c-in-python
これもRubyと同じですね。スタック情報から取り出す関数を書けということのようです。

次はGoです。
むむむ、ありません。
デバッグ出力する際は、関数名を自前で書けというのでしょうか?

次はJavaです。
http://d.hatena.ne.jp/sik1/20100611/1276228180
http://www.recital.com/index.php?option=com_content&view=article&id=201%3Ahowto-use-file-and-line-in-java-programs&Itemid=59
ありました。
スタックからとってくる方式ですね。
C#も多分同じでしょう。

次はJavaScriptです。
http://stackoverflow.com/questions/453028/line-equivalent-in-javascript
ブラウザにもよるらしいですね。

まとめると、Go以外はいけそうな感じです。
次回はassert()について調べる予定です。