通过在客户的机器上运行我们的软件,我们可以获得核心文件。不幸的是,由于我们一直使用-O2 进行 编译, 而没有
调试符号,这导致了无法弄清崩溃原因的情况,我们修改了构建,现在它们一起生成-g和-O2。然后,我们建议客户运行-g二进制文件,以便于调试。
我有几个问题:
这是一个崩溃的示例,它要求我们告诉客户获得-g版本。的二进制:
Program terminated with signal 11, Segmentation fault.
#0 0xffffe410 in __kernel_vsyscall ()
(gdb) where
#0 0xffffe410 in __kernel_vsyscall ()
#1 0x00454ff1 in select () from /lib/libc.so.6
...
<omitted frames>
理想情况下,我想解决以找出导致应用程序崩溃的原因-我怀疑这是内存损坏,但我不是100%肯定。
严格禁止远程调试。
谢谢
当从Linux发行版生成核心文件而不是我们在Dev中运行的核心文件时,会发生什么情况?堆栈跟踪是否有意义?
如果可执行文件是动态链接的,就象您的动态链接一样,GDB生成的堆栈(很可能) 没有 意义。
原因:GDB知道您的可执行文件通过libc.so.6
在address处调用某个东西而崩溃了0x00454ff1
,但它不知道该地址上的代码是什么。因此,它将查看
您的 副本,libc.so.6
并发现该副本位于中select
,因此将其打印出来。
但是0x00454ff1
在您的 客户 副本中选择的机会也libc.so.6
很小。顾客很可能在那个地址有其他程序abort
。
您可以使用disas select
,然后观察它0x00454ff1
是否在指令中间,或者上一条指令不是CALL
。如果这些条件之一成立,那么您的堆栈跟踪将毫无意义。
但是,您 可以 自助:您只需(gdb) info shared
要从客户系统中获取列出的所有库的副本。让客户将它们焦油起来
cd /
tar cvzf to-you.tar.gz lib/libc.so.6 lib/ld-linux.so.2 ...
然后,在您的系统上:
mkdir /tmp/from-customer
tar xzf to-you.tar.gz -C /tmp/from-customer
gdb /path/to/binary
(gdb) set solib-absolute-prefix /tmp/from-customer
(gdb) core core # Note: very important to set solib-... before loading core
(gdb) where # Get meaningful stack trace!
然后,我们建议客户运行-g二进制文件,以便于调试。
一个 多 更好的方法是:
-g -O2 -o myexe.dbg
strip -g myexe.dbg -o myexe
myexe
发给客户core
,用于对其myexe.dbg
进行调试您将拥有完整的符号信息(文件/行,局部变量),而不必向客户发送特殊的二进制文件,也无需透露太多有关源的详细信息。
问题内容: 每次我的应用程序崩溃时,都不会生成核心转储文件。我记得几天前,它 是 在另一台服务器 上 生成的。我正在使用bash屏幕运行应用程序,如下所示: 如您所见,如果要生成核心转储,则在使用哪个选项很重要,但是当遇到分段错误时,它仍然不会生成。我该如何运作? 问题答案: 确保当前目录(崩溃时可能会更改目录)是可写的。如果服务器调用,则该目录必须是该用户可写的。 同时检查。这可能会将核心转储重
和默认安装在 我尝试在gallium OS上安装qutebrowser。由于操作系统基于xubuntu,我遵循以下步骤: https://qutebrowser.org/doc/install.html#_ubuntu_16_04_lts_linux_mint_18 我使用pip3.5安装了python程序所需的所有缺失包。我遇到了几个问题,在对堆栈溢出进行了一些研究之后,我发现了以下链接: 未找
今天遇到一些问题,我需要知道它们之间的具体区别 < code >编译“com . firebase:firebase-client-Android:2 . 4 . 0” 和 不要注意版本 所以请分享你的知识。
问题内容: 有时,当我运行代码时,用+ 终止程序会生成一个核心转储文件。文件名的格式为。该程序不会突然终止,并且没有分段错误。我认为这是不和。如果我尝试+ 或+ ,则不会生成。 谁能说出为什么仅在按+ 时才生成?如何避免生成此核心转储文件?核心转储文件有什么用? 问题答案: 当进程由于程序故障而被操作系统终止时,进程将转储核心。发生这种情况的最典型原因是因为程序访问了无效的指针值。鉴于您有一个零星
我正在考虑使用Ignite和。NET客户机进行一个项目。 我很好奇客户机是否支持。NET核心,因此可以在。NET核心应用程序中使用。 如果没有,未来是否计划了。NET核心支持?
我对假装很陌生。今天就发现吧……当我读到Spring Cloud Feign时,我的第一个问题是:“您如何包装您的Fiign客户机?” 我举个例子。假设我们有2个微服务M1和M2。M2使用来自M1的endpoint。 null 也许我完全错了,请指正。 多谢!拜拜