c++符号表分离———objcopy(调试信息挂载)

开发游戏项目时;我发现使用release版本的服务器程序在运行时以及通过gdb查看core文件时崩溃了。
我们怀疑这是由痕迹和使用不当造成的。
数组。
为了深入调试问题,我们尝试在debug版本中使用gdb查看core文件,但效果并不理想。
比较调试版本和发布版本;我们发现发布版本在使用最高级别优化选项(-O3)编译时排除了调试信息。
经过研究,我发现debug版本是用-g3选项编译的;使可执行文件包含调试信息。
获取符号信息以提高效率。
我开始探索在Linux下使用objcopy命令来获得符号表分区。
通过一系列的行动,我们可以去掉符号信息和符号信息,产生一个光滑的可执行文件。
第一的,我们使用main.cpp文件来编译并生成可执行文件的发布版本(mainO3)。
用readelf-S命令查看其段信息,发现mainO3的可执行文件不包含调试信息,但仍有调试信息。
此时,我们使用objcopy命令对符号表进行拆分,成功生成了符号表文件(mainO3.symbol)和平滑函数文件(mainO3.bin)。
虽然尺寸没有太大变化,比较表明符号表文件与原始输出文件大小相同。
然后,我们生成一个包含调试信息的可执行文件(maingo)。
相似地,我们提取符号表并使用objcopy命令生成符号表文件(maingo.symbol)和简单的可执行文件(maingo.bin)。
对比这三个文件,我们发现调试版本的可执行文件maingo的大小显大于发布版本的mainO3。
同时,图表文件maingo.symbol的大小与maingo相当,请注意,精简后的可执行文件maingo.bin要小得多。
然后,我们在gdb中加载可执行文件;设置断点;maingo.bin执行程序后生成的版本;解析完调试版本和符号表后,查看局部变量来比较调试过程中可以提供的信息。
结果发现该版本在调试时无法查看符号信息,很难发现问题结果显示。
调试版本是提供高效调试支持的文件名。
动作行数;代码和局部变量值清晰可见。
解析完符号表后,maingo.bin在针对发布版本运行时无法查看符号信息。
然而,我们在启动gdb时遇到了无法使用-s命令查看符号信息的问题。
尽管符号表安装在缩小的执行文件中。
gdb显示调试时仍然无法显示函数信息和局部变量值。
尽管如此,通过安装符号表,我们可以保留一定程度的调试功能,保证核心功能的可用性,同时又不会降低程序的性能。
最后,虽然将源文件放在编译执行目录下是无法查看源代码的。
在优化时您仍然可以看到该方法的适应性如何。
文件。

什么是内核符号表(Kernel

内核中通过/proc/kallsyms获取符号地址Linux内核符号表形成过程/proc/kallsyms./scripts/kallsyms.c负责生成System.map./kernel/kallsyms.c。
负责生成/proc/kallsyms./scripts/kallsyms.c解析vmlinux(.tmp_vmlinux)生成kallsyms.S(.tmp_kallsyms.S),然后内核编译过程中,kallsyms.S(内核符号表)是编译成uImage内核镜像内核启动后,/kernel/kallsyms.c解析uImage形成/proc/kallsyms/proc/kallsyms,其中包含内核。

如何使用uname-a将内核中的函数符号(包括没有EXPORT_SYMBOL)和全局变量(用EXPORT_SYMBOL导出的全局变量)导出到/proc/kallsyms来查看内核

linux驱动怎么调试

如何调试linux驱动程序?启用调试信息(config_debug_kernel、config_dynamic_debug)。
编译内核(允许调试信息)。
安装内核调试工具(gdb、kdb、dmesg)。
加载驱动程序(使用调试参数)。
设置断点(使用break命令)。
启动调试器(kdb或gdb)。
调试驱动程序(使用调试命令)。
分析内核日志(使用dmesg命令)。
使用符号表(使用kallsyms命令)。
使用内核分析器(例如kgdb或coredump)。
Linux驱动调试指南如何调试Linux驱动?调试Linux驱动程序时,可以执行以下步骤:1.通过修改内核配置文件并启用CONFIG_DEBUG_KERNEL和CONFIG_DYNAMIC_DEBUG选项来启用调试信息。
2.使用启用了调试信息的内核配置编译内核,然后重新编译内核。
3.安装内核调试工具。
安装必要的内核调试工具,如:gdb:用于调试器kdb:用于内核调试器dmesg:用于显示内核消息4.加载驱动程序使用insmod命令加载驱动程序并传递参数debugnumber。
例如:insmodmy_driver.kodebug5。
设置断点在调试器(例如gdb)中,设置断点以在感兴趣的位置暂停执行。
您可以使用break命令,例如:(gdb)breakmy_function6。
启动调试器。
使用kdb命令启动内核调试器,或直接使用gdb附加到内核进程,例如(gdb)attach:17。
调试驱动程序使用step、next、print等。
调试器命令单步执行驱动程序代码并检查变量的值。
8、分析内核日志使用dmesg命令查看内核日志,查找与驱动程序相关的警告或错误信息。
9.使用符号表在调试过程中,可以使用kallsyms命令查看内核符号表并将地址映射到符号名称。
10.使用内核分析器您可以使用KGDB或Coredump等内核分析器来分析内核崩溃或崩溃的根本原因。