PytorchのC++部分のデバッグ

C++ コードの VSCode のデバッグ機能について話します。

task.json は毎回必要ではありません

生成した実行可能ファイルをデバッグするために VSCode のデバッグ ウィンドウを使用するだけの場合は、それはまったくtasks.json必要ありません。このファイルはコンパイル用のヘルプ ファイルです。tasks.jsonパラメータを設定した後、set gcc コマンドを実行します。コンパイル。すでにコンパイル済みの場合は、これは必要ありません。

必要なのはlaunch.jsonファイルのみです。以下は私が構成した例です。

{  
    "version": "0.2.0",  
    "configurations": [  
        {  
            "name": "debug",  
            "type": "cppdbg",  
            "request": "launch",  
            "program": "path/to/bin",  
            "args": [  
                "--model-repository=/test_model_repository_debug/centernet-trt-ensemble",  
                "--http-port=8007",  
                "--cuda-memory-pool-byte-size=0:134217728"  
            ],  
            "stopAtEntry": false,  
            "cwd": "${workspaceFolder}",  
            "environment": [{"name":"LD_LIBRARY_PATH", "value":"${LD_LIBRARY_PATH}:/usr/local/cuda/lib64:/home/re2/obj/so"},  
                            {"name":"CUDA_VISIBLE_DEVICES","value": "4"}],  
            "externalConsole": false,  
            "MIMode": "gdb",  
            "setupCommands": [  
                {  
                    "description": "Enable pretty-printing for gdb",  
                    "text": "-enable-pretty-printing",  
                    "ignoreFailures": true  
                }  
            ],  
            "miDebuggerPath": "/usr/bin/gdb",  
            "logging": { "engineLogging": true }  
        }  
    ]  
}  

よく使用される場所のいくつかを分析してみましょう。

  • preLaunchTask": "g++"必要ないので削除しますtasks.json

  • "request": "launch"一般にlaunch、アタッチのプロセスをキャプチャする必要がある場合は、これを に設定しますattach。Pytorch の「詳細な」DEBUG 方法を確認できます。

  • "program": "path/to/bin"コンパイルされた実行可能ファイルのアドレス

  • "args": [ ],コマンドラインパラメータ、上部の具体的な記述方法

  • "environment": [{"name":"CUDA_VISIBLE_DEVICES","value": "4"}],環境変数。実行可能ファイルに環境変数を設定する必要がある場合は、これを変更し、形式を変更して、上記の例を参照してください。

その他、一般的に使用されないものについては紹介しませんので、詳しく知りたい場合は公式ドキュメント https://code.visualstudio.com/docs/editor/debugging を参照してください。

 デバッグヒーロー

Python から C++ までのすべてのデバッグ

C++ のデバッグに加えて、C++ と Python を組み合わせたライブラリ (Pytorch、TVM など) もいくつかあります。これは、C++ コアをラップする Python の層に相当します。この種のソフトウェア ライブラリに遭遇した場合、または同様のソフトウェア ライブラリを構築する必要がある場合、この状況でデバッグするにはどうすればよいですか?

Pytorch のデバッグは通常、Python 側で実行され、モデルを構築する一般的なタスクには十分です。ただし、Pytorch に変更を加えたり、マシンまたはディープ ラーニング システムがどのように構築されているかを調査したりする必要がある場合、より深く調査するには、C++ のソース コード レベルを関与させる必要があります。たとえば、torch.rand(3, 4)この関数の場合、Python では、Python 側のデバッグを通じてその内部実装に入ることができず、その定義を見つけることもできず、当然のことながら、その特定の実装の詳細を調査することもできません。 Pytorch の C++ 部分をデバッグする必要があります。

準備

まず、Pycharm+VSCODE(Linux側)、もちろんPython環境とgdb(これは一般公開されています)が必要です。その後、仮想環境を作成し、Pytorchのソースコードをコンパイルします。Pytorchのソースコードをデバッグしたいので、まずPytorchのソースコードをコンパイルする必要があります。コンパイルするときは、DEBUG 環境変数を変更し、デバッグ バージョンの pytorch をコンパイルする必要があります。コマンドは です。DEBUG=1 python setup.py install詳細なコンパイル手順については、次の記事を参照してください。ここでは詳しく説明しません。

  • Pytorch ソースコード コンパイルの簡潔なガイド

Pytorch をコンパイルした後、VSCODE を使用して Pytorch ディレクトリを開き、プロジェクト ファイル全体を開き、左側のデバッグ アイコンをクリックして初めてデバッグを開始します。VSCODE は、構成ファイルを追加するように求めます。launch.jsonディレクトリ.vscode

次に、ファイルを変更しますlaunch.json。主にプログラム列を Python インタープリターのパスに変更し、その他の列は変更しません。

"name": "(gdb) Attach",  
"type": "cppdbg",  
"request": "attach",  
"program": "/home/prototype/anaconda3/envs/pytorch/bin/python", -- 修改这一栏为你执行pytorch的python路径  
"processId": "${command:pickProcess}",  
"MIMode": "gdb",  
"setupCommands": [  
    {  
        "description": "Enable pretty-printing for gdb",  
        "text": "-enable-pretty-printing",  
        "ignoreFailures": true  
    }  
]  
デバッグの開始

デバッグの原則は次のとおりです。

  • まず Python コードを実行して、現在実行中の ID プロセス番号を取得します。

  • 次に、gdb を通じてプロセス番号を取得し、C++ コードをデバッグします。

キャプチャ プロセスがあるため、キャプチャ前に C++ で設定したブレークポイントを介してプログラムが実行されるのを防ぐために、まず、実行する .py ファイルに sleep ステートメントを追加し、プログラムを実行させる必要があります。 air しばらくすると、時間は自分で決めることが多いですtime.sleep(50)また、あらかじめブレークしたいC++コードにブレークポイントを設定しておき、VScode上でブレークしたいコード行をクリックして設定します。次に、デバッグ モードで pytorch コードを実行します (pycharm のデバッグ ボタンをクリックします)。コンソールでこの時点のプロセスが28536であることがわかります。

プロセス番号を確認する

以前に設定した VSCODE で [デバッグ] をクリックします。 小さな緑色の点をクリックします。

この時点で、アタッチする前のプロセス番号を入力します。この時点ではシステムに root 権限が必要な場合があることに注意してください。確認するには y を入力してください。プロセス番号を入力してください

しばらく待った後 (time.sleep の時間)、設定したブレークポイントでプログラムが停止したことがわかります。この時点で、pytorch の Python フロントエンドから C++ バックエンドに入りました。C++ ソースをロックしました。コード 

デバッグ情報は次のとおりです: whaosoft  aiot  http://143ai.com  

GNU gdb (Ubuntu 8.2-0ubuntu1~16.04.1) 8.2  
Copyright (C) 2018 Free Software Foundation, Inc.  
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>  
This is free software: you are free to change and redistribute it.  
There is NO WARRANTY, to the extent permitted by law.  
Type "show copying" and "show warranty" for details.  
This GDB was configured as "x86_64-linux-gnu".  
Type "show configuration" for configuration details.  
For bug reporting instructions, please see:  
<http://www.gnu.org/software/gdb/bugs/>.  
Find the GDB manual and other documentation resources online at:  
    <http://www.gnu.org/software/gdb/documentation/>.  
  
For help, type "help".  
Type "apropos word" to search for commands related to "word".  
Warning: Debuggee TargetArchitecture not detected, assuming x86_64.  
=cmd-param-changed,param="pagination",value="off"  
[New LWP 15524]  
[New LWP 15525]  
[New LWP 15528]  
[Thread debugging using libthread_db enabled]  
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".  
0x00007fe9efc605d3 in select () at ../sysdeps/unix/syscall-template.S:84  
Loaded '/lib/x86_64-linux-gnu/libpthread.so.0'. Symbols loaded.  
Loaded '/lib/x86_64-linux-gnu/libc.so.6'. Symbols loaded.  
Loaded '/lib/x86_64-linux-gnu/libdl.so.2'. Symbols loaded.  
Loaded '/lib/x86_64-linux-gnu/libutil.so.1'. Symbols loaded.  
Loaded '/lib/x86_64-linux-gnu/librt.so.1'. Symbols loaded.  
Loaded '/lib/x86_64-linux-gnu/libm.so.6'. Symbols loaded.  
Loaded '/lib64/ld-linux-x86-64.so.2'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_heapq.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_opcode.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/zlib.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/../../libz.so.1'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_bz2.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_lzma.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/../../liblzma.so.5'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/grp.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_posixsubprocess.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/select.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/math.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_hashlib.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/../../libcrypto.so.1.1'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_blake2.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_sha3.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_bisect.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_random.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_struct.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/binascii.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_socket.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_datetime.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_ssl.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/../../libssl.so.1.1'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_ctypes.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/../../libffi.so.6'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/numpy/_mklinit.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/numpy/../../../libmkl_rt.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/numpy/../../../libiomp5.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/bin/../lib/libgcc_s.so.1'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/numpy/core/_multiarray_umath.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_pickle.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/numpy/core/_multiarray_tests.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/numpy/linalg/lapack_lite.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/numpy/linalg/_umath_linalg.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_decimal.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/numpy/fft/fftpack_lite.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/mkl_fft/_pydfti.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/numpy/random/mtrand.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/numpy/../../../libmkl_core.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/numpy/../../../libmkl_intel_thread.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/numpy/../../../libmkl_intel_lp64.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/numpy/../../../libmkl_avx512.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/numpy/../../../libmkl_vml_avx512.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_json.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/pyexpat.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/fcntl.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/termios.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/resource.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/array.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_multiprocessing.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_asyncio.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_sqlite3.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/../../libsqlite3.so.0'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/unicodedata.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_lsprof.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/torch/_C.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/torch/lib/libshm.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/torch/lib/libtorch_python.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/libstdc++.so.6'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/torch/lib/libtorch.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/torch/lib/libc10.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/libmkl_gnu_thread.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/libgomp.so.1'. Symbols loaded.  
Loaded '/usr/lib/libmpi_cxx.so.1'. Symbols loaded.  
Loaded '/usr/lib/libmpi.so.12'. Symbols loaded.  
Loaded '/usr/lib/x86_64-linux-gnu/libnuma.so.1'. Symbols loaded.  
Loaded '/usr/lib/libibverbs.so.1'. Symbols loaded.  
Loaded '/usr/lib/libopen-rte.so.12'. Symbols loaded.  
Loaded '/usr/lib/libopen-pal.so.13'. Symbols loaded.  
Loaded '/usr/lib/x86_64-linux-gnu/libhwloc.so.5'. Symbols loaded.  
Loaded '/usr/lib/x86_64-linux-gnu/libltdl.so.7'. Symbols loaded.  
[Switching to thread 4 (Thread 0x7fe9de0e0700 (LWP 15528))](running)  
=thread-selected,id="4"  
  
Thread 1 "python" hit Breakpoint 4, torch::autograd::THPVariable_rand (self_=0x0, args=0x7fe9df2cff08, kwargs=0x0) at ../torch/csrc/autograd/generated/python_torch_functions.cpp:8134  
8134   }, /*traceable=*/true);  
Execute debugger commands using "-exec <command>", for example "-exec info registers" will list registers in use (when GDB is the debugger)  

ブレークポイント 4に成功したことがわかりますこの時点で、VSCODE を使用して Pytorch をデバッグできるようになります。このときのデバッグ方法は、以前の C++ 単独のデバッグと何ら変わりません。

おすすめ

転載: blog.csdn.net/qq_29788741/article/details/131745717