GDB除錯Python C extension
測試範例
1 |
|
{: file=’myadd.cpp’}
1 | import myadd |
{: file=’myscript.py’}
1 | from distutils.core import setup, Extension |
{: file=’setup.py’}
安裝GCC
1 | sudo apt-get install build-essential |
安裝python標頭檔
1 | apt-get install python3-dev |
安裝venv
最好要使用venv來開發c extension,因為如果沒有使用venv,python3 setup.py install
編譯好的套件
1 | apt install python3-venv |
編譯範例程式
1 | python3 setup.py install |
安裝Python debug symbol
下面指令python的版本可以改成你自己的python版本
1 | apt-get install python3.10-dbg |
以GDB執行Python
1 | gdb python |
注意!!必須先正確安裝Python的debug symbol再執行這一步,完成後你應該要可以看到成功載入Python debug symbol,gdb的顯示類似如下
1 | GNU gdb (Ubuntu 12.1-0ubuntu1~22.04) 12.1 |
如果你看到(No debugging symbols found in python)
表示GDB找不到Python debug symbols。
GDB下中斷點
這一步會預先
建立一個中斷點,引為此時我們的extension還沒被Python載入。再這個範例我們把中斷點下在myadd.cpp
第12行z = x + y
的位置
1 | (gdb)b myadd.cpp:12 |
這時候GDB會問你是不是要建立一個未來使用的中斷點,回答是就可以
1 | (gdb) b myadd.cpp:12 |
Python呼叫extension
最後在GDB裡面執行myscript.py
程式,就可以看到程式停在我們的中斷點
1 | (gdb) run myscript.py |
debug Python 好用的指令
參考:
編譯教學
https://uwpce-pythoncert.github.io/Py300/notes/BuildingExtensions.html
安裝debug symbol
https://wiki.python.org/moin/DebuggingWithGdb
gdb除錯參考:
https://scipy-lectures.org/advanced/debugging/index.html#debugging-segmentation-faults-using-gdb
加入gdb路徑
https://devguide.python.org/advanced-tools/gdb/index.html#gdb-7-and-later
範例程式
https://nadiah.org/2020/03/01/example-debug-mixed-python-c-in-visual-studio-code/
GDB除錯Python C extension