首页 > 编程语言 >C++ debug

C++ debug

时间:2024-12-12 19:21:45浏览次数:5  
标签:调用 unw C++ program func debug my

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 调试器 :提供图形化界面,适合实时调试。

标签:调用,unw,C++,program,func,debug,my
From: https://www.cnblogs.com/michaelcjl/p/18603211

相关文章

  • python debug
    pythondebug在Python中,查看程序的调用栈(callstack)可以帮助你调试代码,了解函数调用的顺序和上下文。以下是查看Python调用栈的常用方法。1.使用traceback模块traceback是Python标准库模块,可用于打印异常发生时的调用栈或程序的当前调用栈。示例:打印当前调用栈impo......
  • [C++] 继承详解
    目录前言演示用编译器及其标准DevC++6.7.5Redpanda C++14                           先 赞 后 看  养  成 习 惯  正文1、继承的概念与意义2、继承的使用 2.1继承的定义及语法2......
  • C++_运算符重载
    filesystemc++11在CMakeList.txtfind_package(BoostCOMPONENTSsystemfilesystemregexREQUIRED)include_directories(${Boost_INCLUDE_DIRS})target_link_libraries(projectname${Boost_LIBRARIES})程序#include<boost/filesystem.hpp>......
  • C++ Boost库 tuple元组
    元组boost::tuple是Boost库中提供的允许程序员创建固定大小的元组,这些元组可以包含不同类型的元素。元组是一个数据结构,它可以存储多个值,这些值可以是不同类型的。boost::tuple是C++标准库中std::tuple的前身,后者在C++11标准中被引入。特点固定大小:一旦创建,boost::tuple的大小......
  • C++11 lock_guard和unique_lock
    一、RAII技术1、ResourceAcquisitionIsInitialization,资源获取即初始化,由C++之父提出。2、使用局部对象来管理资源的技术,称为资源获取即初始化。3、资源主要指操作系统中有限的东西,如内存、套接字等;局部对象指存储在栈里的对象,生命周期由操作系统来管理。4、资源......
  • C++学习笔记 数组
    1.一维数组1.1数组的定义数组的定义方式和变量类似。#include<iostream>#include<algorithm>usingnamespacestd;intmain(){inta[10],b[10];floatf[33];doubled[123];charc[21];return0;}1.2数组的初始化在main函数内部,未初......
  • C++ 的发展
    目录​编辑C++的发展总结:​编辑1. C++的早期发展(1979-1985)2. C++标准化过程(1985-1998)3. C++标准演化(2003-2011)4. C++11(2011年)5. C++14(2014年)6. C++17(2017年)7. C++20(2020年)8. C++23(2023年)1. C++1985:C++1.0主要特性:示例代码:代码讲解:C++1.0的局......
  • 在CodeBolcks+wxWidgets+wxSmith下的C++编程教程——用向导创建一个wxWidgets项目(sTet
    0.前言我想通过编写一个完整的游戏程序方式引导读者体验程序设计的全过程。我将采用多种方式编写具有相同效果的应用程序,并通过不同方式形成的代码和实现方法的对比来理解程序开发更深层的知识。了解我编写教程的思路,请参阅体现我最初想法的那篇文章中的“1.编程计划”:学习编程......
  • 23. C++STL 9 (priority_queue的使用和适配实现详解)
    ⭐本篇重点:1priority_queue的使用与底层原理2使用容器来适配priority_queue⭐本篇代码:c++学习·橘子真甜/c++-learning-of-yzc-码云-开源中国(gitee.com)⭐标⭐是比较重要的部分目录一.priority_queue(优先级队列)的使用与原理1.1priority_queue的底层原理......
  • c++ CMakeLists.txt详解
    基本结构CMake最低版本声明用于指定需要的最低CMake版本,确保兼容性。cmake_minimum_required(VERSION3.10)指定CMake的最低版本。确保用户的CMake版本符合项目需求,否则报错。版本选择建议根据项目使用的功能决定。例如,3.10引入了target_link_directories。......