Pytest debug/C++ debug_前进吧-程序员的博客-程序员秘密_pytest debug

技术标签: c++  python  debug  c/c++源代码  Linux  shell  linux  

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u011233383/article/details/104902276

智能推荐

远程桌面连接(远程控制另一电脑)的详细步骤_怎么远程桌面连接另一台电脑_zhangduang_KHKW的博客-程序员秘密

通过电脑A远程控制电脑B:电脑B必须要设置用户名和密码,否则连接不成功。1、打开电脑B的允许远程连接1.1、首先打开电脑B的远程控制:桌面找到我的电脑,右键选择“属性” ;1.2、点击“远程设置”;1.3、点击“远程” -> 把“允许远程协助连接这台计算机”前面的框点击选中,然后点击下面的“确定”;2、找到需要控制的电脑B的IP地址2.1、按键“windows+r”,调出“运行”,输入"cmd",然后输入“ipconfig”,回车;2.2、找到IPv

Windows服务没有及时响应启动或控制请求1053_aofgryq715157389的博客-程序员秘密

参考链接:解决“指定的服务已经标记为删除”问题服务没有及时响应启动或控制请求 1053关闭服务后,重新启动windows服务报错:"服务没有及时响应启动或控制请求 1053"此时需要确认启动服务时服务在任务管理器中是停止运行的状态程序安装后,在“服务”中启动服务报:“指定的服务已经标记为删除”此时可以先关闭服务窗口,启动后再打开。即操作服务的时候“服务...

Dalian Bin Al 3-3 draw with Shanghai International Port_weixin_30689307的博客-程序员秘密

Jordans 2013Dalian Bin Al with Shanghai International Port Group match of the 2013 Super League season 3 start competing in Dalian Jinzhou New District Stadium. After 90 minutes of fighting, the two ...

【c语言】判断回文字符串_坚韧百折不挠的博客-程序员秘密

判断回文字符串:如:    abcba   abcdefedcba#include#includeint panduan(char *s){ int n=strlen(s); int i=0; for(;i<n/2;i++) { if(*(s+i)!=*(s+n-i-1)) { printf("不是回文字符串\n"); got

Ubuntu 18.04 下Qt5开发环境搭建(安装,配置,美化,卸载)_ubuntu qt5_ZLOZL的博客-程序员秘密

Ubuntu 18.04 下Qt5开发环境搭建(安装,配置,美化,卸载)我本人用的Ubuntu是18.04的,安装的Qt是5.14.1下载你要安装的Qt版本官网下载地址:http://download.qt.io/archive/qt/或者百度网盘下载地址:链接:https://pan.baidu.com/s/1MazRtGOkj8FNdR_x-sclQA提取码:ypb1修改运行软件权限chmod 755 qt-opensource-linux-x64-5.14.1.run开始安装软件

随便推点

dbms_backup_restore包的使用_annicybc的博客-程序员秘密

昨天做一个实验,结果把数据库搞坏了,当试图进行恢复时居然报了RMAN-06026错误。 回想一下,原来在尝试恢复中使用了_allow_resetlogs_corruption参数,resetlogs之后,Oracle使用当前的控制文件不允许从这个历史备份集中进行恢复。由于我没有使用catalog,所以尝试使用dbms_backup_restore进行恢复。1.错误信息我们看到虽然list back

狙击面试官-21条 Linux 常用命令_tar zxvf -c 已存在文件_落失的风筝的博客-程序员秘密

本文我总结啦21条Linux的常用命令,同时也是面试官考察你对Linux系统使用的熟练度,比较精准的Linux命令,你可以收藏、当然转发会更棒哦~~更加可以版这篇文章作为一个Linux命令参考手册。正文开始前先来推荐学习课程:(能够非常有用的帮助到你哦~)1、Linux入门课程Linux云计算运维架构linux基础和shell编程_Linux入门课程Linux云计算运维架构_shell编程入门课程shell脚本基础实战教程2、Java300集零基础适合初学者视频教程_Java300集零基础教

【2】FSL MRI 脑部图像安装教程与流程_vmware上装fsl_whatever?picky?的博客-程序员秘密

FLS 官网 FMRIB's Software LibraryFSL - FslWiki全名是:FMRIB'sSoftwareLibrary - FMRIB 是 英国牛津大学脑功能磁共振成像中心,FSL 则是他们开发的一个软件库。 - 由 Stephen Smith 教授开发,发布于 2000年 - 适用于所有操作系统 - 用于结构 MRI、功能 MRI(任务、静息)、扩散 MRI的分析 - MRI, CT数据的预处理和分析 - MRI, CT数据的查看FSL 的应用举例1. 分割之...

iostat监测磁盘IO和CPU利用率,并重定向到文件中_Michaelzhangyy的博客-程序员秘密

今天用iostat监测磁盘IO 和CPU利用率,用iostat重定向到文件中:>iostat -t 5 -x > iostat.out-t是输出时间和日期,5是代表5秒一次,-x是详细情况都输出主要查看cpu的idle和磁盘的util

flutter报错Your app isn’t using AndroidX.解决方法_舜岳的博客-程序员秘密

flutter报错Your app isn’t using AndroidX.并报错无法运行:解决方法:gradle.properties文件添加如下字段:android.enableJetifier=trueandroid.useAndroidX=true如图:保存后再次运行:成功!...

ubuntu 开机启动Firefox以及带有界面的程序_火狐 登录shell_Joho_Zhou的博客-程序员秘密

ubuntu 开机启动Firefox演示教程1. 系统环境操作系统:Linux ubuntu 5.4.0-52-generic #57~18.04.1-UbuntuFirefox:Mozilla Firefox 82.02. 准备工作在 /sbin或者/usr/bin添加 firefox的启动命令,保证在shell状态下能直接启动firefox;如果需要启动自定义的程序,需要创建一个shell脚本,让脚本启动自定义程序,然后将脚本放在 /sbin下。3. 编写.desktop文件在 ~/.co