Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Pythonのコードの気になる行でスタックトレースを出す

 Pythonのコードの気になる行でスタックトレースを出す

以下動画のスライドです

https://youtu.be/iNWVkb5Pj1I

Avatar for Satoru Takeuchi

Satoru Takeuchi PRO

November 15, 2025
Tweet

More Decks by Satoru Takeuchi

Other Decks in Technology

Transcript

  1. Pythonのデバッガであるpdbを使うと楽ができる • pdbは非常に多機能なデバッガ a. 所定のコードで一時停止するブレークポイントを仕掛けられる b. 停止時に変数の値を読み書き c. 停止した時点から一行だけ実行 •

    デバッガはデバッグだけでなくソースコードリーディングにも役立つ • やること 1. pdbを介してmkdocsを起動する 2. Page.render()にブレークポイントを仕掛ける 3. mkdocsを実行する 4. ブレークポイントでmkdocsが自動的に停止する 5. バックトレースを表示する。 ▪ これで呼び出し関係がわかる
  2. pdbを介してmkdocsを実行 $ uv run -m pdb -m mkdocs serve >

    /home/sat/src/mkdocs/mkdocs/__main__.py(3)<module>() -> from __future__ import annotations (Pdb)
  3. “l”コマンドで停止した場所を表示 (Pdb) l 260 title = title.capitalize() 261 return title

    262 263 B def render(self, config: MkDocsConfig, files: Files) -> None: 264 """Convert the Markdown source file to HTML as per the config.""" 265 -> if self.markdown is None: 266 raise RuntimeError("`markdown` field hasn't been set (via `read_source`)") 267 268 md = markdown.Markdown( 269 extensions=config['markdown_extensions'], 270 extension_configs=config['mdx_configs'] or {},
  4. “bt”コマンドでbacktraceを表示 • コードを読まずにコードの呼び出し関係がわかる (Pdb) bt /usr/lib/python3.12/bdb.py(600)run() -> exec(cmd, globals, locals)

    /home/sat/src/mkdocs/mkdocs/__main__.py(370)<module>() … -> serve.serve(**kwargs) /home/sat/src/mkdocs/mkdocs/commands/serve.py(85)serve() -> builder(config) /home/sat/src/mkdocs/mkdocs/commands/serve.py(67)builder() -> build(config, serve_url=None if is_clean else serve_url, dirty=is_dirty) /home/sat/src/mkdocs/mkdocs/commands/build.py(310)build() -> _populate_page(file.page, config, files, dirty) /home/sat/src/mkdocs/mkdocs/commands/build.py(167)_populate_page() -> page.render(config, files) > /home/sat/src/mkdocs/mkdocs/structure/pages.py(265)render() -> if self.markdown is None:
  5. 手作業で頑張って調べたものと同じ&より確実 (Pdb) bt /usr/lib/python3.12/bdb.py(600)run() -> exec(cmd, globals, locals) /home/sat/src/mkdocs/mkdocs/__main__.py(370)<module>() …

    -> serve.serve(**kwargs) /home/sat/src/mkdocs/mkdocs/commands/ serve.py(85)serve() -> builder(config) /home/sat/src/mkdocs/mkdocs/commands/ serve.py(67)builder() -> build(config, serve_url=None if is_clean else serve_url, dirty=is_dirty) /home/sat/src/mkdocs/mkdocs/commands/ build.py(310)build() -> _populate_page(file.page, config, files, dirty) /home/sat/src/mkdocs/mkdocs/commands/ build.py(167)_populate_page() -> page.render(config, files) > /home/sat/src/mkdocs/mkdocs/structure/ pages.py(265)render() -> if self.markdown is None: デバッガ 手作業 serve_command() -> serve.serve() -> server.serve.builder() -> server.serve.builder.build() -> _populate_page() -> Page.render()
  6. まとめ • デバッガ(pdb)はコードリーディングにも有用 • 嬉しいところ ◦ コードの変更が不要 ◦ コード上のある行が、期待する状況で実際に呼ばれること、その時の呼び出し関係がわかる •

    難点 ◦ インタフェースが無骨なので慣れが必要 ▪ コードエディタやIDEだともっと便利な方法がありそう ◦ 別のルートから同じ行が呼ばれてた場合も停止してしまうので扱いが面倒