前の関連記事:PyCharm(2)ブレークポイント設定後デバックツールウィンドウを出す
デバッグツールウィンドウの3つの枠についてみていきます。
デバックツールウィンドウのなかにはタブと枠が複数ある
デバックツールウィンドウにはDebuggerタブとConsoleタブがあります。
Consoleタブに出力されたものでまだみていないものがあるとアイコンの右下に↓がついています。
最初はデバッガに繋ぎましたという表示が出力されています。
プログラムのエラーもこのConsoleタブに出力されますのでprint()もしていないのに↓がついているときはエラーメッセージがでているかもしれないのでConsoleタブを確認します。
Debuggerタブの中には左からフレーム(Frames)と変数(Variables)、ウォッチ(Watches)の3つの枠があります。
フレーム枠 Debug Tool Window. Frames
フレームとはPython(4)関数の引数の変数名やそれに代入されているコードを取得ででてきたものと同じですね。
Python(5)クロージャ(Closure)のお勉強でみたような変数の静的スコープを一単位としたものがフレームのようです。
フレーム枠には新しいフレームが上から追加されています。
関数, ファイル名:行番号
1行はこういう構成になっているようです。
グローバルスコープは<module>になるようです。
3行目以降の灰色の字のものはデバッガのプログラムなのでデバッグには関係ないと思います。
(わざわざ表示されているということはそれから情報が得られるということかもしれませんが、いまの私にはわかりません。)
上記のフレーム枠の2行目から1行目に読んでいくと、PyCharm2.pyを実行するとそのファイルの6行目のグローバルスコープから同じくPyCharm2.pyの3行目のfib関数のローカルスコープに移動したことがわかります。
一番上の「MainThread」というドロップダウンリストはマルチスレッドのときに使います。
Python(3)WSGI:ウェブページからshutdown()メソッドでWSGIサーバを停止させるでマルチスレッドはやりましたね。
Debugger - PyCharm - Confluenceはマルチスレッドの例が使われています。
各スレッドの状態をデバッグするにはマルチスレッドの状態のところにブレークポイントを設定します。
Debugger - PyCharm - ConfluenceのThreadSample.pyですと、threading.Thread(target=print_time, args=(1,))のターゲットになっている関数の中にブレークポイントを設定します。
具体的にはprint_time()の中にブレークポイントを設定します。
その状態でデバッグボタンをクリックするとスレッドを選択できます。
このときMainThreadは動いていることになっていてMainThreadの状態はFrames not available in non-suspended stateと表示されて確認できませんね。
変数枠 Debug Tool Window. Variables
止めている行までにでてきた変数の値が表示されます。
変数の種類によってアイコンが変わります。
はシークエンス型、 は普通の変数、 はオブジェクト、はフィールドです。
Pythonでフィールドというのは何を指すのでしょうかね?
オブジェクトはこんな感じで表示されます。
「label」はこのTreeクラスで定義してデータ属性です。
<__main__.Tree object at 0x02F051D0>、と書いてあっても何のことかわからないので、Python(19)二分木を出力する部分をwhile文で書くでやったように特殊メソッドの__repr__()を使ってわかりやすい表示を定義した方がデバッグしやすいです。
__repr__()でデータ属性のself.labelを返しています。
Inspect 特定の項目の状態を控えておきたいときに。
右クリックからInspectを選択するとその状態が別ウィンドウに表示されます。
これはあとででてくるWatchesと違ってコードを進めても値は変化しません。
シークエンス型やオブジェクトでその要素を選択した状態にすると左端の「Set As Root」ボタンがクリックできるようになります。
「Set As Root」ボタンをクリックしたときに選択されていた項目がルートとなり、以後は「Set As Root」ボタンをクリックするとその項目に移動します。
右横にある矢印ボタンで階層を移動できます。
一度設定したルートは変更できないようです。
変更したいときはこのInspectウィンドウを右クリックして新たにInspectウィンドウを作ります。
一時的に値を確認したいだけの場合はコードエディタの変数の上にカーソルを持ってくるだけでその内容のポップアップがでます。
さらにポップアップの先頭にある+をクリックするとInspectと同じようなウィンドウがでます。
でもこれのウィンドウは他のウィンドウを選択すると消えてしまいます。
Set Value 変数の中身を変更できる?
ヘルプををみるとフィールドや変数のランタイムの値を変更できると書いてありますが、変更するとすべて{NoneType} Noneと表示されるだけです。
しかもこうなっても「Step Over」ボタンをクリックして次に進むと変更は反映されていません。
うーん、これは使い方がわかりませんね。
値の変更はPyCharm(4)デバックツールウィンドウのボタンでEvaluate Expressionウィンドウを使えばできます。
Compare Value with Clipboard クリップボードの内容との相違を表示する
Compare Value with Clipboardを選択するとすでにクリップボードに入っている内容との相違を表示してくれます。
クリップボードに入っているものなら左側に表示されて比較されるので、Variables枠以外のものとも比較できます。
Add to Watches 特定の項目を表示させる
これは先ほどのInspectと違ってコードの進行に合わせて値が変化します。
変数枠の右のウォッチ枠に表示されます。
ウォッチ枠 Debug Tool Window. Watches
変化をみたい値に着目できます。
Variables枠で着目したい項目を選択して右クリック→Add to Watchesで追加するか、ウォッチ枠の+ボタンや右クリック→New Watch、で追加できます。
右クリックメニューのEditを選択するとウォッチ式を編集できます。
参考にしたサイト
9.3.3. インスタンスオブジェクト
データ属性 (data attribute) は、Smalltalk の “インスタンス変数” や C++の “データメンバ” に相当します。
Debug Tool Window. Frames
デバッグツールウィンドウフレーム枠のヘルプ。
Debug Tool Window. Variables
デバッグツールウィンドウ変数枠のヘルプ。
デバッグツールウィンドウ変数枠のヘルプ。
0 件のコメント:
コメントを投稿