GoogleAppEngineの開発環境でpdbとEmacsでデバッグする

GAEのコードもCarbon Emacsで書いているわけですが、デバッガが使えないのがキツいと思っていたら、python標準のpdbをちょっとした変更だけで使えるという事がわかりました。従ってEmacsでもM-x pdbが出来るという事で、かなり心理的な負荷が下がりましたので、記録します。

pdbはpythonについているデバッガで、普通は以下のコードをデバッグしたいコードの周辺に埋め込んで実行すると、そこがブレークポイントとなって実行が止まります。後はgdb的にステップ実行していくわけです。

import pdb; pdb.set_trace()  # この行を埋め込む

for i in range(10): # 例えばここをステップ実行したい
  do something

ところが、GAEだと上記のコードを埋め込んでもデバッグできません。set_traceで実行が止まってくれないのです。そこで、調べてみるとビンゴなページがありました。埋め込むコードが少し増えるのですが、以下のコードを埋め込めばいつも通りset_traceで実行が止まります。

import sys
import pdb
for attr in ('stdin', 'stdout', 'stderr'):
  setattr(sys, attr, getattr(sys, '__%s__' % attr))
pdb.set_trace()      # ここまでの5行を埋め込むとここで実行が止まる。

# ここからステップ実行する
do_something

何故こうすれば止まるのかは理解していません。ごめんなさい。

まぁでも、とにかくこれでpdbが使えるようになりました。後はEmacsからpdbを呼び出せば無事にいつものステップ実行が出来るようになります。

M-x pdb
/usr/local/bin/dev_appserver.py /path/to/application

注意点はdev_appserver.pyとアプリディレクトリを絶対パスで通す事ですね。

pdbの使い方はドキュメント参照と言いたいところですが、ググっても意外と出てこないですね。この辺と、英語ですけど、この辺が解り易かったです。

あと、本番環境では使えないので、開発環境をなるだけ本番環境に近づけるのが良いかと思います。限界もありますが。。

Leave a Reply

Your email address will not be published. Required fields are marked *