当前位置: 首页 > 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++的虚函数与多态

相关文章:

  • 相机DreamCamera2录像模式适配尺寸
  • 知识体系_数据量纲化处理方式
  • 详细图解 Path-SAM2: Transfer SAM2 for digital pathology semantic segmentation
  • 计算机网络-运输层(1)
  • 2025.4.27_C_Struct,Enum,Union
  • 如何通过OKR管理项目目标
  • 【第三十三周】BLIP论文阅读笔记
  • Flink02-学习-套接字分词
  • Ldap高效数据同步- MirrorMode双主复制模式配置详解(上)
  • 在 Cursor 中 配置 GitHub MCP Server
  • AI 应用同质化:一场看不见的资源 “吞噬战”
  • 软考:软件设计师考试数据结构知识点详解
  • HTML5 新特性详解:语义化标签、表单与音视频嵌入
  • 底层源码和具体测试解析HotSpot JVM的notify唤醒有序性(5000字详解)
  • JimuBI 积木报表 v1.9.5发布,大屏和仪表盘,免费数据可视化
  • 当AI浏览器和AI搜索替代掉传统搜索份额时,老牌的搜索引擎市场何去何从。
  • ubuntu 日志文件清空方式的解读
  • Ubuntu22.04/24.04 P104-100 安装驱动和 CUDA Toolkit
  • FFmpeg之三 录制音频并保存, API编解码从理论到实战
  • C++初阶-STL简介
  • 美联储报告披露关税战冲击波:消费信心下降,经济担忧加深
  • 解码人格拼图:探索心理健康的多维视角
  • 与包乐史驾帆航行|航海、钓鱼和写书:一个记者的再就业之路
  • 预订假期酒店却被告知无法入住,去哪儿:对违规酒店予以处罚
  • 大家聊中国式现代化|彭羽:为国家试制度探新路,推进高水平对外开放
  • 北京顺义潮白河大桥主跨坍塌原因公布,已成立事故调查组