C++で作成した共有ライブラリ(.so)のデバッグをVScodeでやろううとしたが,
あまり情報がなく苦労したので記事にしておきます。
共有ライブラリの作成
まずはライブラリの作成
g++ -shared -g -fPIC -o libtodebug.so file1.cpp file2.cpp
分割コンパイルする場合は
g++ -g -fPIC -c -o file1.o file1.cpp
g++ -g -fPIC -c -o file2.o file2.cpp
g++ -shared -o libtodebug.so file1.o file2.o
でビルドします. -fPICオプションを入れる必要があります.
VScodeでデバック
VScodeのデバッグでは,
デバッグ設定ファイルに共有ライブラリを使用する実行ファイルを起動するよう設定する必要があります。
launch.json
{
// IntelliSense を使用して利用可能な属性を学べます。
// 既存の属性の説明をホバーして表示します。
// 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Pythonデバッガ",
"type": "cppdbg",
"request": "launch",
"program": "python",
"args": [
"${デバッグ用のPythonファイル名, debug.py}"
],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
gdbでデバッグをするプログラムにPythonのプログラムを指定し,
Pythonないで共有ライブラリを読み込み, Pythonから共有ライブラリ内の関数をコールすることで,
gdbでデバッグを行うという形になります.
もちろんPythonでもなくていいのですが,
今回は共有ライブラリをロードして実行する関数が書きやすいPythonを選択しました.
Pythonプログラムの作成
共有ライブラリをロードして関数をコールするPythonプログラムを書きます.
debug.py
import ctypes
def main():
sharedlib = ctypes.cdll.LoadLibrary("./libtodebug.so")
func = sharedlib .SampleFunc
func.argtypes = [ctypes.c_int]
func.argtypes = [ctypes.c_int]
res = func(ctypes.c_int(10))
print(res)
if "__name__" == "__main__":
main()
こんな感じになります。
私の場合はtkinterでGUIを作成して柔軟にデバッグできる環境を作成しました.