Pytest debug/C++ debug

4 篇文章 0 订阅
2 篇文章 0 订阅

Python/C++ debug

debug的方式有很多最简单的方式是打印log,看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

  1. 有时候在使用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打断点, 有两种方式

  1. 在case要断点的位置,加入如下两行代码
import pdb
pdb.set_trace()
  1. 可以在运行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'))

解释:

  1. 使用pgrep helloworld获取binary运行的进程号,
  2. 加载运行的binary来获取符号表, file + binary
  3. attach + pid of binary即可

gdbhelloworld

#!/bin/bash

cgdb -x path of gdbhelloworld.py

解释:
为了方便使用,加入一个脚本,使用cgdb,方便看到调试代码上下文。cgdb可以认为是对gdb的一个封装。可以一边调试,一边方便的看到当前正在运行的代码上下文

调试

执行顺序

  1. 执行带有断点的pytest.
  2. 然后执行 ./gdbhelloworld
  3. 在./gdbhelloworld中打断点,如
b main.cpp:10
  1. 在3的基础上输入c,让binary持续运行。
  2. 在pytest的pdb中单步调试,正在合适的时候就会执行到gdb的断点位置。
  3. 然后就可以happy的玩耍了。

参考

None

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值