当前位置: 首页 > news >正文

DAY8-GDB调试及打桩

GDB打桩

1.类成员函数打桩

// example1.cpp
#include <iostream>class Calculator {
public:int add(int a, int b) {return a + b;}
};int main() {Calculator calc;std::cout << "Result: " << calc.add(2, 3) << std::endl;return 0;
}
(gdb) break Calculator::add
(gdb) run
(gdb) return 100  # 强制返回100
(gdb) continue
  1. 虚函数打桩
// example2.cpp
#include <iostream>class Base {
public:virtual void show() {std::cout << "Base show()" << std::endl;}
};class Derived : public Base {
public:void show() override {std::cout << "Derived show()" << std::endl;}
};int main() {Base* obj = new Derived();obj->show();delete obj;return 0;
}
(gdb) break Derived::show
(gdb) run
(gdb) jump Base::show  # 跳转到基类实现
(gdb) continue

3.STL容器打桩

// example3.cpp
#include <iostream>
#include <vector>void printVector(const std::vector<int>& vec) {for (int num : vec) {std::cout << num << " ";}std::cout << std::endl;
}int main() {std::vector<int> numbers = {1, 2, 3};printVector(numbers);return 0;
}
(gdb) break main
(gdb) run
(gdb) p vec
# 假设输出为 {1, 2, 3} size=3# 尝试push_back
(gdb) call vec.push_back(4)
# 如果报错,尝试:# 方法1:类型转换
(gdb) call ((std::vector<int>*)&vec)->push_back(4)# 方法2:直接操作内部指针
(gdb) set $p = (int*)vec._M_impl._M_start
(gdb) set $p[3] = 4
(gdb) set vec._M_impl._M_finish = vec._M_impl._M_start + 4# 验证
(gdb) p vec
# 现在应该显示 {1, 2, 3, 4} size=4
  1. 模板函数打桩
// example4.cpp
#include <iostream>
#include <string>template<typename T>
T max(T a, T b) {return a > b ? a : b;
}int main() {std::cout << "Max: " << max(10, 20) << std::endl;std::cout << "Max: " << max(std::string("apple"), std::string("banana")) << std::endl;return 0;
}
(gdb) break 'int max<int>(int, int)'
(gdb) run
(gdb) return 1000  # 修改int版本的返回值
(gdb) continue
  1. 异常处理打桩
// example5.cpp
#include <iostream>
#include <stdexcept>void riskyFunction() {// 正常情况下不会抛出异常std::cout << "Normal execution" << std::endl;
}int main() {try {riskyFunction();std::cout << "No exception" << std::endl;} catch (const std::exception& e) {std::cout << "Exception: " << e.what() << std::endl;}return 0;
}
(gdb) break riskyFunction
(gdb) run
(gdb) call throw std::runtime_error("Forced by GDB")
(gdb) continue

GDB调试实战

学习链接:GDB调试C++的虚函数与多态

http://www.xdnf.cn/news/186139.html

相关文章:

  • BOPF Business Object Development
  • AiCube 试用 - ADC 水位监测系统
  • NameSilo转入转出域名
  • 大模型笔记8 文本数据清洗
  • C语言数据结构—数组(cpu内存与指针)
  • CSS选择器
  • 6.图的OJ题(1-10,未完)
  • shell命令二
  • “八股训练营”学习总结
  • Linux学习——FTP(功能实现)
  • windows anaconda 配置 ipynb 环境
  • 《电商业务分析终极框架:从数据到决策的标准化路径》
  • OpenLayers WebGL与3D渲染 (进阶一)
  • 五分钟讲清数据需求怎么梳理!
  • 数据库关系模型的总结
  • 软件功能设计视角下的能源管理系统功能清单构建与实践
  • Redis高可用架构全解析:主从复制、哨兵模式与集群实战指南
  • 2025系统架构师---黑板架构风格
  • 风控策略引擎架构设计全解析:构建智能实时决策系统
  • 探索大语言模型(LLM):自监督学习——从数据内在规律中解锁AI的“自学”密码
  • MLLM之Bench:LEGO-Puzzles的简介、安装和使用方法、案例应用之详细攻略
  • OpenSSH 漏洞 CVE-2025-26465 和 CVE-2025-26466 可引发中间人攻击和 DoS 攻击
  • 毫米波振荡器设计知识笔记
  • BeautifulSoup的详细使用说明
  • 迈锐思C1pro插件安装包【附百度网盘链接】
  • 信创系统 sudoers 权限配置实战!从小白到高手
  • Spring 与 ActiveMQ 的深度集成实践(三)
  • ARP协议(地址解析协议)
  • Unreal Niagara制作Scratch随模型发射粒子特效
  • Make学习二:makefile组成要素