河南省住房城乡建设厅官方网站,泰安网红人物,如何在工商局网站做企业年报,wordpress下拉菜单不显示文章目录 查看源码是否编译时有-g调试信息和符号表在 gdb 中加载 debug 文件/符号表将 debug 文件放入 .debug 文件夹通过 gdb 命令 set debug-file-directory directories GCC的gcc和g区别指定gcc/g#xff0c;glibc的版本进行编译指定gcc/g的版本指定glibc的和l… 文章目录 查看源码是否编译时有-g调试信息和符号表在 gdb 中加载 debug 文件/符号表将 debug 文件放入 .debug 文件夹通过 gdb 命令 set debug-file-directory directories GCC的gcc和g区别指定gcc/gglibc的版本进行编译指定gcc/g的版本指定glibc的和ld版本 apt安装后软件所在路径gdb寻找单独的debug文件的路径gdb带源码调试libcgdb寻找源码的路径 gdb带源码调试libc 查看编译是否是debug模式 使用gcc生成动态库及使用动态库的方法
查看源码是否编译时有-g
-g编译的可执行性程序多了很多.debug开头的段 而没有加-g的没有 调试信息和符号表
这里说的调试信息指的是 debug_* 相关信息符号表是指 symtab 和 dynsym。gdb 对这两种信息进行解析和加工得到的信息在 gdb 内部统称为符号表。
调试信息需要带上 -g 编译选项才能产生。
其实符号表包括 symtab 和 dynsym 两种。在没有 -g 编译也会产生在重定位过程中需要处理。
symtab 包括两种类型符号全局符号和本地静态符号。dynsym 仅仅包加载动态库所需要的符号。
在 gdb 中加载 debug 文件/符号表
参考链接 在使用 GDB 调试的时候就不容易看到 libc 中的各种结构。所以我们需要加载符号表来方便调试。
Ubuntu 的软件维护者在编译对应的 ELF 文件时会将符号表与 ELF 文件分离将符号表命名为 “*-dbg.deb”。这样我们就可以通过手动下载符号表来方便调试。
如果是使用 “glibc all in one” 下载的 libc会在 libc 等库放置的位置使用 “.debug” 文件夹存放好了 libc 的符号表使用 gdb 可以自动加载。但是碰到 “glibc all in one” 没有的 libc 版本时就需要手动下载 debug 文件并手动加载了。
将 debug 文件放入 “.debug” 文件夹
在放置 libc 的目录下新建 .debug文件夹将 debug 文件放入其中即可。
通过 gdb 命令 set debug-file-directory directories
我们需要将 libc 等库的 debug 文件放入对应文件夹并通过 set debug-file-directory $directories 命令将文件夹设为分离的 debug 文件目录就可以让 gdb 加载 debug 文件。
GCC的gcc和g区别
GCC:GNU Compiler Collection(GUN 编译器集合)它可以编译C、C、JAV、Fortran、Pascal、Object-C、Ada等语言。
gcc是GCC中的GUN C CompilerC 编译器
g是GCC中的GUN C CompilerC编译器
一个有趣的事实就是就本质而言gcc和g并不是编译器也不是编译器的集合它们只是一种驱动器根据参数中要编译的文件的类型调用对应的GUN编译器而已比如用gcc编译一个c文件的话会有以下几个步骤
Step1Call a preprocessor, like cpp.
Step2Call an actual compiler, like cc or cc1.
Step3Call an assembler, like as.
Step4Call a linker, like ld
由于编译器是可以更换的所以gcc不仅仅可以编译C文件
所以更准确的说法是gcc调用了C compiler而g调用了C compiler
指定gcc/gglibc的版本进行编译
不同版本的GCC实现了不同版本的c和c标准库。这对代码的兼容性有一定影响。每个版本的gcc和标准库版本的对应关系可以在官方文档中找到。使用不同版本的标准库可能会导致代码编译和运行的行为发生不同甚至会报错。因此在编写代码时应该了解所使用的标准库版本并避免使用已经废弃或不再维护的标准库。
指定gcc/g的版本
export CCgcc的路径
export CXXg的路径
指定glibc的和ld版本
通过设置环境变量LD_LIBRARY_PATH增加默认库文件搜索路径会优先匹配我们提供目录中的libc
通过gcc 的-L参数指定glibc库(libc.so)的路径
在gcc的编译参数中指定 -Wl,–dynamic-linkerglibc中动态链接器的路径如下
-Wl,--dynamic-linker/动态连接器的路径/ld-linux-x86-64.so.2
apt安装后软件所在路径
参考链接
dpkg -L 软件包的名字可以知道这个软件包包含了哪些文件 这个方法可以列出所有安装后留在系统里的文件查询系统中已安装的软件包所安装的位置. 系统安装软件一般在/usr/share可执行的文件在/usr/bin配置文件可能安装到了/etc下等。
文档一般在 /usr/share
可执行文件 /usr/bin
配置文件 /etc
lib文件 /usr/lib
gdb寻找单独的debug文件的路径
参考链接
gdb寻找单独的debug文件的路径是
当前文件所在的目录。当前文件所在目录下的.debug目录。debug-file-directory设置的目录下寻找当前可执行程序的调试信息会根据文件所在的实际路径组合去寻找。比如debug-file-directory设置的目录为/usr/lib/debug 一个可执行文件所在的目录是/home/test/example,那么gdb就回去/usr/lib/debug/home/test/下去寻找example.debug文件如果是要寻找动态库文件.so的调试信息则会使用ldd所显示的目录。可以直接使用debug-file-directory目录ldd显示目录进行拼接即可。比如debug-file-directory设置的目录为/usr/lib/debugldd显示出来的liba.so的路径是/home/zy/debuginfo/fff/liba.sogdb就会去/usr/lib/debug/home/zy/debuginfo/fff目录下去读取liba.so所对应的debuginfo文件
set debug-file-directory directories
Set the directories which GDB searches for separate debugging information files to directory. Multiple path components can be set concatenating them by a path separator.show debug-file-directory
Show the directories GDB searches for separate debugging information files.如前所述如果将debuginfo文件直接放到/usr/lib/debug目录或者通过set-debug-file-directory命令设置的根目录下也是可以的但文件目录的组织结构必须和运行时的目录组织结构一样这个地方有一个需要注意的地方特别是对于so文件在debug-root-directory目录下寻找对应的debuginfo文件时和文件实际所在的位置不一定完全一致而要看连接器能够找到的路径即ldd所显示的路径。gdb是会到debug-root-directory/$LDD显示的目录下去寻找对应的debuginfo文件。而ldd显示出来的路径可能是一个绝对路径也可能是一个相对路径者取决于你的操作系统中所设置的一些so查找路径比如LD_LIBRARY_PATH设置为一个相对路径还是一个绝对路径对于gdb来说去debug-root-directory目录下寻找的路径也不一样。gdb会拿ldd显示出来的路径直接和debug-root-directory拼接一下。比如我当前的LD_LIBRARY_PATH设置为./fff那么gdb就会去/usr/lib/debug/./fff目录下去读取liba.so所对应的debuginfo文件因为ldd现实出来的liba.so的路径是./fff/liba.so。 gdb带源码调试libcgdb寻找源码的路径
在使用gcc编译时如果采用带-g选项编译即可在二进制文件中附加调试信息以便gdb进行源码级别的调试。如果二进制中存在调试信息会去相关目录寻找源码GDB首先在编译时目录中搜索如果失败则在当前目录中搜索即$cdir:$cwd其中$cdir指的是编译时目录compilation directory$cwd指的是当前工作目录current working directory。如果找到了源码文件则可以使用gdb的list命令来查看源码。 通过在ubuntu中安装带调试信息的libc并下载libc源码即可配置gdb跟入libc的库函数后进行源码级别的调试 不过如果我们gdb在默认寻找的目录中找不到源码文件则无法进行源码调试。如果源码在其他目录可以在gdb中用directory或dir命令指定或者在启动gdb时用-d参数指定一样可以看到源码。 libc6-dbg是一个包含C标准库调试符号的调试信息包 sudo apt install libc6-dbg sudo apt install libc6-dbg:i386libc6-dev 当前gcc编译链接时使用的版本的libc库源码
首先修改/etc/apt/sources.list将deb-src配置开启更新sudo apt update使用apt source下载源码apt source libc6-dev
然后在调试时用directory把目录指向对应子文件夹就可以了比如我要调试malloc gdb -q ./可执行性文件 -d 下载的libc库源码文件夹路径/malloc或者是在gdb中直接用directory
directory 下载的libc库源码文件夹路径/malloc