cmake下编译release添加可调试的信息

本文介绍了如何在Linux环境下设置core文件生成,并构建带调试信息的程序,以便于分析程序崩溃时的core dump文件。通过`ulimit -c unlimited`启用core文件生成,然后使用`gdb`进行调试,例如`gdb ./program core.xxx`。内容涵盖了CMake编译选项的调整,如`-g`和`-O2`,以及core文件的查看和分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
    add_definitions(-DAF_CLASSARRANGE_EXPORTS)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,-Bsymbolic")
    set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
    set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -g -O2 -Wall")
    add_compile_options(-Wall -Wextra -Wpedantic -fPIC -fvisibility=hidden)
    add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0)
else()
    add_definitions(-D_CRT_SECURE_NO_WARNINGS -DAF_CLASSARRANGE_EXPORTS)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /utf-8")
	set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zi")
    set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /DEBUG:FULL /OPT:REF /OPT:ICF")
    set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DEBUG:FULL /OPT:REF /OPT:ICF")
endif()

主要是这一句:

set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -g -O2 -Wall")

原来没有调试信息的

set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

linux下查询dump文件(core文件)使用步奏

1:执行ulimit -c unlimited
2:首先构建带有调试信息的可执行程序
3:运行可执行程序,如果崩溃会在当前路径下产生core.XXX文件
4:可以用下面命令查看最新的core文件

ll
-rw------- 1 root root 1286144 Feb 28 12:51 core.1135
-rw------- 1 root root 1286144 Feb 28 13:41 core.17359
-rw------- 1 root root 1286144 Feb 28 12:53 core.2208
-rw------- 1 root root 1286144 Feb 28 11:27 core.25633
-rw------- 1 root root 1286144 Feb 28 11:32 core.27753
-rw------- 1 root root 962560 Feb 28 11:36 core.29026
-rw------- 1 root root 1286144 Feb 28 11:39 core.30271
-rw------- 1 root root 1286144 Feb 28 12:56 core.3488
-rw------- 1 root root 1286144 Feb 28 12:57 core.4169
-rw------- 1 root root 1286144 Feb 28 12:58 core.4770
-rw------- 1 root root 1286144 Feb 28 15:47 core.5168
-rw------- 1 root root 1286144 Feb 28 12:59 core.5213

5:gdb project core.xxx 调试奔溃信息可以指定到某一行

例:gdb ./commonomrtest core.5168
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-100.el7
Copyright © 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later http://gnu.org/licenses/gpl.html
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type “show copying”
and “show warranty” for details.
This GDB was configured as “x86_64-redhat-linux-gnu”.
For bug reporting instructions, please see:
http://www.gnu.org/software/gdb/bugs/
Reading symbols from /commonomrtest…done.
[New LWP 5168]
[Thread debugging using libthread_db enabled]
Using host libthread_db library “/lib64/libthread_db.so.1”.
Core was generated by `./commonomrtest’.
Program terminated with signal 11, Segmentation fault.
#0 main () at /commonomrtest.cpp:53
53 *p=100;

参考:https://blog.youkuaiyun.com/happylzs2008/article/details/103534662

### 回答1: CMake是一个跨平台的构建工具,可用于创建、测试和打包C++代码项目。在CMake中,release编译是指构建一个用于发布的版本,它会对代码进行优化以提高执行速度和减少二进制文件的大小。 与debug编译相比,release编译关注的是代码的运行和执行效率。为了使代码更快地运行,release编译对代码进行了优化,例如去除代码中没有使用的部分,减少代码中的重复计算等。这些优化可以大大提高代码的运行速度和执行效率。 另外,release编译还会生成可以直接发布的二进制文件,它们没有debug信息和其他调试工具,因此文件的大小也会减少。这些二进制文件通常比debug版本的快速执行,因为它们包含更少的调试代码和其他元数据。 总之,release编译的目标是创建一个性能更好、文件更小的产品版本,可供最终用户使用。因此,在编译代码时,开发人员应该仔细选择构建目标,以便最大化代码性能和效率。 ### 回答2: CMake是一种跨平台的开源构建自动化工具,它可以帮助程序员管理C++编译、依赖、链接、测试等方面的问题。Release编译是指在发布产品的时候进行的编译操作,目的是生成可执行的、优化过的、没有调试信息的程序,以提高产品的性能和安全性。 要进行CMake Release编译,需要在CMake中进行一些配置和设置。下面是具体的步骤: 1. 在CMakeLists.txt文件中添加编译选项:在CMakeLists.txt文件中添加set(CMAKE_BUILD_TYPE "Release"),这会告诉CMake编译器使用Release模式来进行编译,以优化程序性能。 2. 清空已有的编译文件:在编译Release版本之前应该先清空已有的编译文件。在命令行中进入项目目录后,输入rm -rf build/,即可清空build文件夹。 3. 建立编译目录:在命令行中输入mkdir build && cd build,新建一个名为build的文件夹,同时进入此文件夹。 4. 运行CMake:在build文件夹下,运行cmake .. ,这会自动生成Makefile。 5. 进行Release编译:在build文件夹下,运行make -j4,其中-j4表示使用4个线程进行编译。在编译完成之后,即可生成可执行的、没有调试信息Release版本的程序。 需要注意的是,如果项目有依赖库,需要在CMakeLists.txt中添加链接库的选项,如target_link_libraries(),以确保在编译时能够正确链接这些依赖库。 总之,CMake Release编译可以生成优化过的、没有调试信息的程序,从而提高应用程序的性能和安全性,是开发人员必须掌握的基本技能之一。 ### 回答3: 在软件开发过程中,我们通常需要将代码编译为可执行文件,以供用户使用。不同的编译方式会影响最终的程序性能、文件大小等因素。 CMake是一款跨平台的编译工具,在编译过程中可以将源代码转化为目标代码或者可执行文件。在使用CMake进行编译时,我们通常会选择编译模式,包括Debug和Release两种。 Debug模式主要用于调试程序,开启了各种优化等设置,但同时也增加了程序的体积,降低了程序的性能。而Release模式则是为了获得最佳的程序性能和最小的程序体积,同时舍弃了调试信息和其他的优化设置。 在使用CMake进行Release编译时,我们需要对CMake进行一些设定。首先,我们需要在CMakeLists.txt中设置编译模式,标明我们要进行的是Release编译。其次,我们需要选择在Release模式下使用哪些编译器选项,以达到最佳的程序性能和最小的程序体积。在编译完成后,我们还可以使用各种工具对程序进行优化设置,以进一步提高程序的性能和减少程序的体积。 总的来说,CMake Release编译过程需要我们进行多次设定和优化设置,以达到最佳的程序性能和最小的程序体积。只有在熟练掌握这些技巧并加以实践之后,才能为我们的程序带来更好的表现和用户体验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搁浅的渔

创作不易,多多支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值