c++调试UnitTest(问题代码在so库里)的方法

今天在公司里练习了如何用gdb来调试code,感觉还是挺复杂的,特别是code的问题出在so里
虽然上周通过肉眼发现了问题到底在哪里,但是这毕竟是最傻的方法,作为c++ coder,我们要用native的工具来辅助自己完成debug工作
等到下次,我就会真正地用gdb来做调试了^_^

precondition:
所有的包都是-g编译出来的
要调试的问题在so库里
已经大概知道问题出在某个函数里

运行UnitTest那个二进制文件,他会卡在选择testcase的界面上
ps -u 记下pid


在.bashrc里添加so文件的路径到环境变量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/xxx/lib

打开gdb并attach
gdb --tui
attach <pid>



用工具来demangling c++代码中的函数名字
objdump -tT function_name
nm -D function_name


如:
objdump -tT xxx.so | grep -i definelicense
0000000000063fe8 T _ZN20FSCLicenseManagement14defineLicensesEPKc


在gdb界面中输入以下内容来打断点:
break _ZN20FSCLicenseManagement14defineLicensesEPKc
此时,输入c,继续运行程序直到打断点的地方
这个时候如果运气好,那么界面上会显示断点处的源代码,否则会出现:
Current language: auto; currently asm
这个时候只能自己手动了
在gdb界面中输入:
list xxx.cpp:linenumber
此时会显示出这个文件linenumber行的代码,这时,只能一个个打断点,记录断点号,然后一次一次地continue,当到达某个断点x时core dump了,那么说明问题出现在断点x-1到x之间


注:
基本gdb命令
break 加断点
continue run直到断点
break function_name 在函数调用处加断点
step 单步
next 下一条语句
stepi 粒度更细的单步
info 显示所有信息,比如断点,寄存器等
until line_number run直到某行
unittest是Python中常用的单元测试框架,它提供了丰富的断言方法用于判断测试结果是否符合预期。下面是一些unittest断言方法代码示例: 1. assertEqual() 该方法用于判断两个值是否相等。 ```python import unittest class MyTest(unittest.TestCase): def test_equal(self): self.assertEqual(1+1, 2) # 断言1+1等于2 ``` 2. assertNotEqual() 该方法用于判断两个值是否不相等。 ```python import unittest class MyTest(unittest.TestCase): def test_not_equal(self): self.assertNotEqual(1+1, 3) # 断言1+1不等于3 ``` 3. assertTrue()和assertFalse() 这两个方法分别用于判断表达式是否为True和False。 ```python import unittest class MyTest(unittest.TestCase): def test_true(self): self.assertTrue(2 > 1) # 断言2大于1为True def test_false(self): self.assertFalse(1 > 2) # 断言1大于2为False ``` 4. assertIn()和assertNotIn() 这两个方法用于判断一个值是否在列表或元组中存在或不存在。 ```python import unittest class MyTest(unittest.TestCase): def test_in(self): myList = [1, 2, 3, 4, 5] self.assertIn(3, myList) # 断言3在myList中存在 def test_not_in(self): myTuple = (1, 2, 3, 4, 5) self.assertNotIn(6, myTuple) # 断言6不在myTuple中存在 ``` 5. assertRaises() 该方法用于判断一个特定的异常是否被抛出。 ```python import unittest def divide(x): return 1/x class MyTest(unittest.TestCase): def test_exception(self): self.assertRaises(ZeroDivisionError, divide, 0) # 断言在divide(0)的情况下会抛出ZeroDivisionError异常 ``` 以上是unittest中几个常用的断言方法代码示例。使用这些断言方法,我们可以方便地对代码进行单元测试,确保其功能的正确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值