首页 > 编程语言 >C程序集成Backward-cpp使用示例

C程序集成Backward-cpp使用示例

时间:2023-02-26 11:01:51浏览次数:65  
标签:main backward 示例 assert build myapp cpp Backward

原文地址:https://www.cnblogs.com/liqinglucky/p/backward-in-C.html

在文章Backward-cpp: Segmentation fault时打印backtrace中已经介绍了backward-cpp的编译安装。不过项目示例都是C++程序。本文使用C程序做为演示打印Segmentation fault的功能。

一 程序

目录结构

backward# ls
backward-cpp
CMakeLists.txt  
main.c

1 main.c

#include<stdio.h>
#include <assert.h>
 
int func3(void) { 
    assert(0);            //构造Segmentation fault
    return 0; 
}

int func2(void) { return func3(); }

int func1(void) { return func2(); }


int main(void)
{
    func1();
    return 0;
}

2 CMakeLists.txt

参考backward-cpp的README,以子目录的方式添加进自己的工程

As a subdirectory:

In this case you have a subdirectory containing the whole repository of Backward

# 项目名称
project( myapp )
cmake_minimum_required( VERSION 3.1 )

# 指定backward-cpp的路径为子目录
add_subdirectory(./backward-cpp)

# define BACKWARD_HAS_DW 1
add_definitions(-DBACKWARD_HAS_DW=1)

# 添加-g参数,显示函数名
set(CMAKE_CXX_FLAGS "-g -Wall")

# 1 指定源代码
set ( SRC_LIST main.c )

# 2 指定执行编译的源代码
add_executable ( ${PROJECT_NAME} ${SRC_LIST} ${BACKWARD_ENABLE})
add_backward(${PROJECT_NAME})
target_link_libraries ( ${PROJECT_NAME} dw )

3 clone backward-cpp

git clone backward-cpp,backward-cpp目录与CMakeLists.txt同级目录。

如果还想对backward-cpp项目中不需要的文件做简化,可以把test文件删除也并不影响。我只保留了以下一个文件。

backward/backward-cpp# ls
BackwardConfig.cmake  backward.cpp  backward.hpp  CMakeLists.txt

二 编译

编译源码

//cmake编译
backward# mkdir build
backward/build# cmake ..
backward/build# make

编译生成

build# ls
myapp      <<< 可执行文件

三 运行

作为对比,通常没有添加backward-cpp时程序异常退出的情况为:

build# ./myapp
myapp: /backward/main.c:5: func3: Assertion `0' failed.
Aborted

编译完成后可以运行可执行文件,看下演示效果:

build# ./myapp
myapp: /backward/main.c:5: func3: Assertion `0' failed.
Stack trace (most recent call last):
#10   Object "", at 0xffffffffffffffff, in
#9    Object "/backward/build/myapp", at 0x56554c12becd, in _start
#8    Source "../csu/libc-start.c", line 308, in __libc_start_main [0x7f1abaf8d082]
#7    Object "/backward/build/myapp", at 0x56554c12bfda, in main
#6    Object "/backward/build/myapp", at 0x56554c12bfcb, in func1
#5    Object "/backward/build/myapp", at 0x56554c12bfbc, in func2
#4    Object "/backward/build/myapp", at 0x56554c12bfaf, in func3
#3    Source "/build/glibc-SzIz7B/glibc-2.31/assert/assert.c", line 101, in __assert_fail [0x7f1abaf9cfd5]
#2    Source "/build/glibc-SzIz7B/glibc-2.31/assert/assert.c", line 92, in __assert_fail_base [0x7f1abaf8b728]
#1    Source "/build/glibc-SzIz7B/glibc-2.31/stdlib/abort.c", line 79, in abort [0x7f1abaf8b858]
#0    Source "../sysdeps/unix/sysv/linux/raise.c", line 51, in raise [0x7f1abafac00b]
Aborted (Signal sent by tkill() 904343 0)
Aborted

这里已经打印出了栈的backtrace。

总结:将backward-cpp集成进自己的工程,可以方便程序的调试。

标签:main,backward,示例,assert,build,myapp,cpp,Backward
From: https://www.cnblogs.com/liqinglucky/p/backward-in-C.html

相关文章

  • getchar()应用示例
    #include<stdio.h>intmain(){intch=0;while((ch=getchar())!=EOF){if(ch<'0'||ch>'9'){continue;}putchar(ch);}return0;}只输......
  • oracle cursor不能共享原因及示例
    1.cursor概念介绍cursor 游标,是ORACLE数据库中SQL解析和执行的载体,本质上是C语言中的一种结构structure.ORACLE数据库中cursor分类: sharedcursor包括: parentcursor......
  • Spring for Apache Kafka: @KafkaListener 的使用示例(消费)
    版本Version2.7.8-- 阅读Version2.7.8的SpringforApacheKafka官方文档,检出其中的注解@KafkaListener的使用方式。关键词:ConsumerRecord、Message、......
  • 一个简单的 PHP 留言本代码示例
    以下是一个简单的PHP留言本代码示例:在HTML文件中创建表单 <!DOCTYPEhtml><html><head><title>留言板</title></head><body><h1>留言板</h1>......
  • PHP 留言本代码示例2
    以下是一个简单的PHP留言本代码示例:index.php:<!DOCTYPEhtml><html><head><title>留言本</title></head><body><h1>留言本</h1><?php//......
  • pandas 常用方法使用示例
    #生成DataFrame,保存至文件frompandasimportDataFrameimportnumpyasnpimportpandasaspdt={"称呼":["爸爸","妈妈","宝宝"],"年龄":[18,30,np.......
  • 委托示例代码
    1usingSystem;23namespaceConsoleApp14{5classProgram6{7staticvoidMain(string[]args)8{9ShengC......
  • cmake搭建cpp测试工程
    创建目录结构撰写CMakeLists.txt点击查看代码#cmake需求的最小版本,2和3不兼容#cmake_minimum_required(VERSION3.1)#置工程名称project(HELLO)#设置变量SOU......
  • A-PlayBook示例
    运行playbook的方式ansible-playbook<filename.yml>...[options]常见选项--check-C只检测可能会发生的改变,但不真正执行操作--list-hosts列出运行任务的主机--list-ta......
  • A-Ansible示例
    示例-pingansible-kall-mpingansible-kall-mcommand-a"ping-c2www.baidu.com"示例-dateansible-k-i/etc/ansible/hostsall-mcommand-a"date"示例-df-h......