GDB如何从Coredump文件恢复动态库信息

GDB如何从Coredump文件恢复动态库信息,第1张

查看 error log:

我们拿到了崩溃位置0xee36f1,如何找到与之相对的代码位置呢?

找台测试机,获取对应版本的安装包:

解压:

然后用 GDB 打开 mysqld:

在 0xee36f1 位置打一个断点:

我们可以看到,gdb 将崩溃位置的文件名和行号都打印出来,

剩下的事情,就可以交给开发工程师,按照这个崩溃堆栈来进行问题排查。虚键碧

赠送章节

红框内的这串信息是什么?我们来解开看一下,

这段信息分为两段,"+0x71" 是一个偏移量,前面是一串文字,我们将文字解析出来:

可以看到前面这串文字是一个函数签名的编码,用 c++filt 还原编码以后,可以看到完整的函数签名。

红框内的这串信息的意思就是崩溃位置是 一个函数起始位置 + 偏移量。

我们大概可以猜到,这个 MySQL 的缺陷是在为 binlog 产生新的文件名时发生的。

小贴士:

函数起始位置 + 偏移量 是一种内差举存位置的表示方法,但该位置不一定是这个函数内的代码。

以本例来说,0xee36f1 这个位置,程序找到了就近的函数 generate_new_name 的起始位置,计算出有 0x71 这么多偏移,就表示成了 generate_new_name+0x71 这种形亮胡式。

但 0xee36f1 这个位置的代码,大概率是,但,不一定是 generate_new_name 这个函数内部的一段代码。

一.首先什么是core dump?

Core的本身意思是内存, Dump的本身意思是扔堆出来。

当我们汪悉开发并且使用 Unix程序时, 有时程序会down了, 却没有任何的提示这时候你可以查看一下有没有样子像困祥乎core.进程号的文件生成, 这个文件是 *** 作系统把程序down掉时的内存内容扔出来生成的, 它可以做为调试程序的参考。

总的来说core dump其实叫核心转储, 它是当程序运行过程中发生异常,  由 *** 作系统把程序当前的内存状况存储在宴雹一个core文件中, 所以叫core dump。

二.怎么使用Core Dump?

首先我们打开Linux下,然后使用: 

#gdb -c core.pid program_name 

就可以进入gdb模式。 

输入where,就可以指出是在哪一行被Down掉,哪个function内,怎么调用等等。 

(gdb) where 

或者输入 bt。 

(gdb) bt 。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/tougao/8172421.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存