C++ debug

news/2024/12/12 19:17:12/文章来源:https://www.cnblogs.com/michaelcjl/p/18603211

C++ debug

在 C++ 中,查看程序的调用栈(Call Stack)通常用于调试崩溃、性能问题或逻辑错误等场景。以下是几种常用的方法来查看调用栈:

1. 使用 GDB 调试器查看调用栈

GDB(GNU Debugger)是 Linux 上非常流行的调试工具,可以用来查看 C++ 程序的调用栈。

示例:
假设有以下 C++ 程序:

#include <iostream>void func_c() {throw std::runtime_error("An error occurred!");
}void func_b() {func_c();
}void func_a() {func_b();
}int main() {try {func_a();} catch (const std::exception &e) {std::cerr << e.what() << std::endl;}return 0;
}

编译程序时加入调试信息(-g 选项):

g++ -g -o my_program my_program.cpp

运行 GDB 调试:

gdb ./my_program

在 GDB 中,运行程序:

(gdb) run

当程序崩溃或异常中断时,输入以下命令查看调用栈:

(gdb) backtrace  # 或简写为 bt

输出示例:

#0  func_c() at my_program.cpp:5
#1  func_b() at my_program.cpp:9
#2  func_a() at my_program.cpp:13
#3  main() at my_program.cpp:19

说明:

backtrace(或 bt)命令会显示从 main 函数到当前执行点的所有函数调用。
调用栈中的每一帧都包含函数名、文件名和行号。

2. 使用 libunwind 库

libunwind 是一个跨平台的库,支持更详细的调用栈分析。
示例:

#include <libunwind.h>
#include <iostream>void print_stacktrace() {unw_cursor_t cursor;unw_context_t context;// 初始化上下文unw_getcontext(&context);unw_init_local(&cursor, &context);std::cout << "Call stack:\n";while (unw_step(&cursor) > 0) {char func_name[256];unw_word_t offset, pc;// 获取程序计数器 (PC)unw_get_reg(&cursor, UNW_REG_IP, &pc);if (pc == 0) break;// 获取函数名if (unw_get_proc_name(&cursor, func_name, sizeof(func_name), &offset) == 0) {std::cout << "0x" << std::hex << pc << ": " << func_name << " + 0x" << offset << "\n";} else {std::cout << "0x" << std::hex << pc << ": [unknown]\n";}}
}void func_c() {print_stacktrace();
}void func_b() {func_c();
}void func_a() {func_b();
}int main() {func_a();return 0;
}

编译并运行:

g++ -g -lunwind -o my_program my_program.cpp./my_program

输出示例:

Call stack:
0x4008a3: print_stacktrace + 0x3f
0x4008c3: func_c + 0x7
0x4008d3: func_b + 0x7
0x4008e3: func_a + 0x7
0x4008f3: main + 0x7
0x7f8c3f2ee0b3: __libc_start_main + 0xf3
0x4007ee: _start + 0x2e

3. 借助 IDE 调试器

现代 IDE (如 CLion、Visual Studio、VSCode)通常集成了强大的调试器,允许你在调试模式下查看调用栈。

使用方式:
在程序中设置断点。
启动调试器。
当程序暂停时,查看调用栈窗口(通常在调试面板中)。

总结

  • GDB :适合在命令行下调试崩溃或运行时问题,使用 backtrace 查看调用栈。
  • libunwind :功能强大,支持跨平台的调用栈分析。
  • IDE 调试器 :提供图形化界面,适合实时调试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/851524.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rasa 最简单对话实现

rasa对话的最简单实现,涉及到了 domain.yml、data\nlu.yml、data\rules.yml 等文件。1.1 简单实现 1.1.1 定义意图和实体 最简单的就是 data/nlu.yml 中编辑 version: "3.1"nlu: - intent: greetexamples: |- 你好- 嗨- 早上好- 晚上好- intent: goodbyeexamples: |…

postgres备份与恢复

一、脚本说明1.环境 docker部署的postgres服务端,宿主机安装postgres客户端,使用命令进行备份恢复2.数据库备份: 使用 pg_dump 命令来备份数据库,并将其压缩为 .sql.gz 或者.tar.gz 格式。 在备份时会包含创建数据库的语句。3.备份清理: 使用 find 命令清理超过指定天数(…

obsidian+picgo+chevereto+picgo图床 笔记文档图片自动上传

简介 obsidian,一款知识管理工具,它支持Markdown格式,所有你的思维、笔记和灵感都能在一个地方相互连接,形成一个井然有序的知识网络。 用obsidian 编辑文本,图片保存本地很大,我们上传到图床,减小文件大小方便不同工具打开使用文本,减小文本空间。文档方传送迁移。 ob…

win10给python起一个别名p

1、安装python 自行安装好python,确保安装成功。2、编写bat脚本 在任意目录(我的目录是:C:\ZProgram\p_bat)编写一个脚本,脚本名称为:p.bat,脚本内容如下: @echo off python %*3、添加环境变量 3.1、将python安装的位置添加到环境变量(系统环境变量)Path 中 3.2、将脚…

转载:【AI系统】CANN 算子类型

算子是编程和数学中的重要概念,它们是用于执行特定操作的符号或函数,以便处理输入值并生成输出值。本文将会介绍 CANN 算子类型及其在 AI 编程和神经网络中的应用,以及华为 CANN 算子在 AI CPU 的详细架构和开发要求。 算子基本介绍 一元算子通过对单个操作数进行操作,如取…

四个强大的 Salesforce 开源替方案(附成本对比)

探索 Salesforce CRM 的最佳开源替代方案。了解像 NocoBase 这样的工具如何为寻求强大 CRM 解决方案的企业提供灵活定制和高性价比。关于 Salesforce Salesforce 于1999 年在美国旧金山创立,作为最早一批提供软件即服务(SaaS) 的公司之一,Salesforce 开创了基于云计算的商业…

转载:【AI系统】混合并行

混合并行(HybridParallel)是一种用于分布式计算的高级策略,它结合了数据并行和模型并行的优势,以更高效地利用计算资源,解决深度学习中的大模型训练问题。混合并行不仅能提高计算效率,还能在有限的硬件资源下处理更大的模型和数据集。在深度学习中,数据并行和模型并行各…

转载:【AI系统】张量并行

在大模型的训练中,单个设备往往无法满足计算和存储需求,因此需要借助分布式训练技术。其中,模型并行(Model Parallelism, MP)是一种重要的方法。模型并行的基本思想是将模型的计算任务拆分到不同的设备上执行,以提高训练效率和处理更大规模的模型。下面将重点介绍模型并行…

转载:【AI系统】动手实现 PyTorch 微分

这里记录一下使用操作符重载(OO)编程方式的自动微分,其中数学实现模式则是使用反向模式(Reverse Mode),综合起来就叫做反向 OO 实现 AD 啦。 基础知识 下面一起来回顾一下操作符重载和反向模式的一些基本概念,然后一起去尝试着用 Python 去实现 PyTorch 这个 AI 框架中最…

转载:【AI系统】计算图原理

在前面的文章曾经提到过,目前主流的 AI 框架都选择使用计算图来抽象神经网络计算表达,通过通用的数据结构(张量)来理解、表达和执行神经网络模型,通过计算图可以把 AI 系统化的问题形象地表示出来。 本文将会以 AI 概念落地的时候,遇到的一些问题与挑战,因此引出了计算图…

转载:【AI系统】计算图基本介绍

在 AI 框架发展的最近一个阶段,技术上主要以计算图来描述神经网络。前期实践最终催生出了工业级 AI:TensorFlow 和 PyTorch,这一时期同时伴随着如 Chainer、DyNet、CNTK、PaddlePaddle、JAX 等激发了框架设计灵感的诸多实验课程。 TensorFlow 和 PyTorch,特别是 PyTorch 代…