模式调试构建和设置CFLAGS变量的问题

时间:2018-03-10 07:18:39

标签: makefile gdb debug-symbols

我使用以下脚本构建以下Artifex MuPDF包:

#!/bin/bash
#########
# FILES #
#########
PACKAGE_NAME=mupdf-1.12.0-source
PACKAGE_TAR_FILE=${PACKAGE_NAME}.tar.xz
PACKAGE_FTP_SITE=https://mupdf.com/downloads/

####################################
# REMOVE OLD STUFF JUST TO BE SURE #
####################################
rm -rf build
rm -rf ${PACKAGE_NAME}
rm -rf ${PACKAGE_TAR_FILE}

#####################################
# Get source code for buggy package #
#####################################
wget ${PACKAGE_FTP_SITE}/${PACKAGE_TAR_FILE}

######################
# Unpack it here ... #
######################
tar xf ${PACKAGE_TAR_FILE}

#################
# Configure ... #
#################
cd ${PACKAGE_NAME}

###############
# Make it !!! #
###############
XCFLAGS="-g -O0" make

我使用XCFLAGS而不是CFLAGS来启用调试版本, 因为它在makefile中说的是什么:

  

不要在make调用行上指定CFLAGS或LIBS - 指定   相反,XCFLAGS或XLIBS。忽略makefile中的任何行   设置在命令行上设置的变量。

但是,当我启动gdb会话时,它表示目标是没有调试符号构建的:

$ gdb --args ./mupdf-1.12.0-source/build/release/mutool poster ~/Downloads/mutool_poster_crash
Reading symbols from ./mupdf-1.12.0-source/build/release/mutool...(no debugging symbols found)...done.

我怎样才能知道发生了什么?谢谢!

1 个答案:

答案 0 :(得分:1)

  

我使用XCFLAGS而不是CFLAGS来启用调试版本

这不是你如何进行调试构建。查看makefile中的目标:

build ?= release

OUT := build/$(build)

default: all

...
...

all: libs apps

clean:
    rm -rf $(OUT)
nuke:
    rm -rf build/* generated $(NAME_GEN)

release:
    $(MAKE) build=release
debug:
    $(MAKE) build=debug

默认构建是版本类型构建,即

OUT := build/release

这就是你所做的:

./mupdf-1.12.0-source/build/release/mutool
                      ^^^^^^^^^^^^^      

发布版本剥离了可执行文件:

mupdf-1.12.0-source$ XCFLAGS="-g -O0" make
...
mupdf-1.12.0-source$ file build/release/mutool 
build/release/mutool: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), \
dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, \
BuildID[sha1]=a77cfe62290635ba12ae8327e24ee545c4dc1ded, \
stripped
^^^^^^^^

因此,使用-g -O0进行编译并不重要。调试信息已被删除。

制作这样的调试版本:

mupdf-1.12.0-source$ make debug

不会删除可执行文件:

mupdf-1.12.0-source$ file build/debug/mutool 
build/debug/mutool: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), \
dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, \
BuildID[sha1]=c43e5aceb02812e1f77d2f00b7f75e4629128aac, \
with debug_info, not stripped
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

您当然可以添加任何您想要的额外XCFLAGSXLIBS个选项。