Pytest debug/C++ debug


Python/C++ debug
debugの方式は多くの最も簡単な方式がlogを印刷して、logを見て、この欠点は比較的に遅くて、特にlogを加える方式で疑いの範囲を縮小します.これは反復を繰り返す過程であるため,最も主要な原因は,最初はコードのどこに問題があるか分からなかった.問題がある可能性のあるすべての場所にログを印刷するしかありません.そして疑いの範囲を徐々に縮小する.次に、迅速なdebug方法について説明します.
UT debug
UTとは
半分のまともな会社は、必ずUTを設計し、UTは単一の機能テストの手段であり、C++に対して、テスト単位はC++クラスのすべてのpublic方法であり、private方法はpublic方法でテストされる.
UT debug
UTの価値は,これまで肉眼では発見されなかった誤りを発見できることである.これもTDD(テスト開発駆動)がこのように燃えている理由の一つです.
現在C++のUTの多くはGTestで、Unitestはもうあまり使われていません.GTestはUT単独のbinaryをコンパイルでき、gdbを直接使用してデバッグすればよいようになった.
gdb binary # no args
gdb --args binary arg1 arg2 # has args.

gdb内部でgdbのコマンドを使用すればよい.以下の一般的なコマンドが含まれます.
#    ,      
n/next
#    ,      ,       
s/step
#       ,      ,      
c/continue
#      main   90    
b main.cpp:90
#            
info locals
#             
info args

NOTE
  • gdb単一ステップデバッグを使用すると、次のステップなのにgdbが戻ってくるという想像が現れることがあります.理由:gccはコードをコンパイルするときに最適化オプションを追加しました.例えば、-OSなどです.これらのコンパイルオプションを削除し、再コンパイルすればいいです.

  • SCT debug
    SCTとは
    MTテストのlevelはUTより高く、注目点は単一のクラスではなく、クラス間のインタラクションで、SCTのテストlevelはMTより高く、binary全体である.基本的にbinary全体の実行環境をシミュレートしてテストすることに相当します.
    業界ではpytestフレームワークが一般的に使用されています.これはpython言語のフレームワークです.このフレームワークでテスト対象、つまり私たち自身のbinaryを実行し、外部入力、つまり必要なテストインタラクションを待っています.
    SCT debug
    startup binary under pytest
    C++コードで書かれたbinaryは、pytest内部で起動します.一般的にsubprocessモジュールを使用して起動します.次のコマンドで起動します.
    self.__proc = subprocess.Popen(self.start_command, shell=True)
    

    start_command:自分のbinaryを実行するコマンドを指します.たとえば、次のようになります.
    helloWorld arg
    

    もちろんbinaryだけでなく、このbinaryを起動する必要があるすべての仕事はpytestで行い、具体的にどのように使用するかはpytest自身のdocを参照する必要があります.
    pytest case
    pytestのdocを参照してcaseを書きます.
    pytest breakpoint – pdb
    まずpytestのcaseブレークポイントに、2つの方法があります.
  • caseブレークポイントの位置に、次の2行のコード
  • を追加します.
    import pdb
    pdb.set_trace()
    
  • pytest caseを実行するときに–traceオプション
  • を追加できます.
    pytest --trace test_hello.py
    

    gdb attach
    私たち自身のbinaryはpytestで起動しているので、gdbから再起動する必要はありません.gdb attachを使用してこのプロセスにattachすることができます.
    実装されるスクリプトは次のとおりです.
    gdbhelloworld.py
    import os
    import subprocess
    pid = subprocess.check_output("pgrep helloworld", shell=True).strip()
    print(pid)
    gdb.execute('file ' + 'path of binary')
    gdb.execute('attach ' + pid.decode('ascii'))
    

    説明:
  • pgrep helloworldを使用してbinaryが実行するプロセス番号を取得します.
  • 実行binaryをロードしてシンボルテーブルを取得し、file+binary
  • attach+pid of binary
  • gdbhelloworld
    #!/bin/bash
    
    cgdb -x path of gdbhelloworld.py
    

    説明:使いやすいように、スクリプトを追加し、cgdbを使用して、デバッグコードコンテキストを簡単に見ることができます.cgdbはgdbに対するパッケージと考えられる.デバッグしながら、現在実行中のコードコンテキストを簡単に見ることができます.
    デバッグ
    実行順序
  • はブレークポイント付きpytestを実行する.
  • が実行されます./gdbhelloworld
  • は./gdbhelloworldでは
  • のようにブレークポイントを打つ
    b main.cpp:10
    
  • 3にcを入力し、binaryを継続させます.
  • pytestのpdbで単一ステップでデバッグし、適切なときにgdbのブレークポイント位置に実行します.
  • それからhappyで遊ぶことができます.

  • リファレンス
    None