- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道我可以使用核心转储文件找出程序哪里出错了。但是有一些BUG,就是用core文件调试也不知道为什么会出错。所以我想传达的是,gdb和core文件能帮你调试的bug范围是有限的。这有多有限?
例如,我写了下面的代码:(libfoo.c)
#include <stdio.h>
#include <stdlib.h>
void foo(void);
int main()
{
puts("This is a mis-compiled runnable shared library");
return 0;
}
void foo()
{
puts("This is the shared function");
}
以下是生成文件:(Makefile)
.PHONY : all clean
all : libfoo.c
gcc -g -Wall -shared -fPIC -Wl,-soname,$(basename $^).so.1 -o $(basename $^).so.1.0.0 $^; \
#the correct compiling command should be :
#gcc -g -Wall -shared -fPIC -pie -Wl,--export-dynamic,-soname,$(basename $^).so.1 -o $(basename $^).so.1.0.0 $^;
sudo ldconfig $(CURDIR); #this will set up soname link \
ln -s $(basename $^).so.1.0.0 $(basename $^).so #this will set up linker name link;
clean :
-rm libfoo.s*; sudo ldconfig;#roll back
当我运行 ./libfoo.so
时,出现段错误,这是因为我以错误的方式编译了可运行的共享库。但我想知道到底是什么导致了段错误。所以我使用了 gdb libfoo.so.1.0.0 corefile
,然后是 bt
并得到了以下内容:
[xhan@localhost Desktop]$ gdb ./libfoo.so core.8326
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-100.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/xiaohan/Desktop/libfoo.so.1.0.0...done.
warning: core file may not match specified executable file.
[New LWP 8326]
Core was generated by `./libfoo.so'.
Program terminated with signal 11, Segmentation fault.
#0 0x0000000000000001 in ?? ()
(gdb) bt
#0 0x0000000000000001 in ?? ()
#1 0x00007ffd29cd13b4 in ?? ()
#2 0x0000000000000000 in ?? ()
(gdb) quit
但我仍然不知道是什么导致了段错误。调试核心文件不能给我任何线索,我的段错误的原因是我使用了错误的编译命令。
谁能帮我调试这个?或者谁能告诉我即使使用 gdb 和核心文件也无法调试的错误范围?仅回答一个问题的答案也将被接受。
谢谢!
/lib64/ld-2.17.so
的共享库。chmod +x nonexecutable
并运行它,然后得到一个错误(通常这不会转储核心文件),并尝试用 gdb 调试它,这有点“疯狂”。但是,一旦可以在运行时加载“可执行文件”并转储核心文件,您就可以使用 gdb 对其进行调试,此外,还可以查找有关程序出错原因的线索。但是,在我的问题 ./libfoo.so
中,我完全迷失了。最佳答案
the scope of the bugs that gdb and core files can help you to debug is limited.
正确:core
dump 对几大类 bug 几乎没有帮助。最常见的(以我的经验)是:
进程启动时发生的问题(例如您展示的示例)。
GDB 需要与动态加载器合作,以告知 GDB 各种 ELF 镜像在进程空间中的哪些位置mmap
。
当崩溃发生在动态加载器本身时,或者在动态加载器有机会告诉 GDB 事情在哪里之前,您最终会得到一个非常困惑的画面。
各种堆损坏错误。
通常您可以判断出问题很可能是堆损坏(例如,malloc
或 free
中的任何崩溃通常是一个迹象),但这告诉您很少关于问题的根本原因。
幸运的是,Valgrind 和 Address Sanitizer 等工具通常可以直接指出问题所在。
各种堆栈溢出错误。
GDB 使用当前堆栈的内容来告诉您如何到达您所在的函数(backtrace
)。
但是如果你用垃圾覆盖堆栈内存,那么你如何到达你所在位置的记录就会丢失。如果您破坏了堆栈,然后使用“grbage”函数指针,那么您最终可能会得到一个核心转储,您无法从中分辨出您在哪里,或者您是如何到达那里的。
各种“逻辑”错误。
例如,假设您有一个树数据结构和一个访问其节点的递归过程。如果你的树不是一棵正确的树,并且其中有一个循环,你的访问过程将用完堆栈并崩溃。
但是看着崩溃告诉你什么树不再是树而是变成了图形的地方。
数据竞赛。
您可能正在遍历 std::vector
的元素并崩溃。检查向量表明它不再处于有效状态。
当其他线程修改您下面的向量(或任何其他数据结构)时,通常会发生这种情况。
同样,崩溃堆栈跟踪很少告诉您错误的实际位置。
关于gdb - 如何使用gdb和core-dump文件找到这个segmentation fault的原因?(GDB的局限性),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49122729/
我对cassandra并使用1.2.10非常陌生。我有一个时间戳数据类型的主键列。现在,我正在尝试检索日期范围的数据。由于我们知道不能在cassandra中使用,因此我使用的是大于()来获取日期范围。
我正在尝试进行有条件的转场。但我得到: Terminating app due to uncaught exception 'NSInvalidArgumentException', reas
我有一个游戏项目,在调试和发布模式下在设备上运行得非常好。我有两个版本。旧版本和新版本具有更多(后来我添加了)功能,并且两者的 bundle ID、版本相同。当我构建旧版本时,之前没有安装“myGam
这个问题已经有答案了: 奥 git _a (2 个回答) 已关闭 5 年前。 我正在获取 ClassCastException 。这两个类来自不同的 jar,但是JettyContinuationPr
以下代码行抛出异常: HttpResponse response = client.execute(request); // actual HTTP request 我能够捕获它并打印: Log
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
public class TwoThreads { private static Object resource = new Object(); private static void
当我输入 6 (int) 作为值时,运行此命令会出现段错误 (gcc filename.c -lm)。请帮助我解决这个问题。预期的功能尚未实现,但我需要知道为什么我已经陷入段错误。 谢谢! #incl
所以,过去一周半我一直在研究这个 .OBJ/.MTL 网格解析器。在这段时间里,我一直在追踪/修复很多错误、清理代码、记录代码等等。 问题是,每修复一个错误,仍然会出现这个问题,而且一张图片胜过一千个
我正在运行一个代码,它基本上围绕 3 个维度旋转一个大数据数组(5000 万行)。但是,我遇到了一个奇怪的问题,我已将其缩小到如何评估旋转矩阵。基本上,对于除绕 x 轴以外的任何旋转,python 代
就在你说这是重复之前,我已经看到了其他问题,但我仍然想发布这个。 所以我正在阅读 Thinking in Java -Bruce Eckel 这篇文章是关于小写命名约定的: In Java 1.0 a
我想在我的应用程序中使用 REST API。它为我从这个应用程序发出的所有请求抛出 SocketTimeoutException。 Logcat 输出:(您也可以在此处看到带有漂亮格式的输出:http
我知道 raise ... from None 并已阅读 How can I more easily suppress previous exceptions when I raise my own
在未能找到各种Unix工具(例如xargs和whatnot)的最新独立二进制文件(this version很好,但需要外部DLL)后,我承担了自己进行编译的挑战。 ...这是痛苦的。 最终,尽管如此,
我有一个用PHP编写的流套接字服务器。 为了查看一次可以处理多少个连接,我用C语言编写了一个模拟器来创建1000个不同的客户端以连接到服务器。 stream_socket_accept几次返回fals
我的Android Studio昨天运行良好,但是今天当我启动Android Studio并想在移动设备上运行应用程序时,发生了以下错误, 我在互联网和stackoverflow上进行了搜索,但没有解
默认情况下,grails似乎为Java域对象的toString()返回:。那当然不是我想要的,所以我尝试@Override toString()返回我想要的。当我尝试grails generate-a
尝试通过LDAP通过LDAP对用户进行身份验证时,出现以下错误。 Reason: Cannot pass null or empty values to constructor. 谁能告诉我做错了什么
我正在尝试使用应用程序附带的 Houdini Python 模块,该模块是 Houdini 安装文件夹的一部分,位于标准 Python 路径之外。按照安装说明操作后,运行 Houdini Termin
简单地说,我正在为基本数据库编写单链表的原始实现。当用户请求打印索引下列出的元素高于数据库中当前记录数量时,我不断出现段错误,但仅当差值为 1 时。对于更高的数字,它只会触发我在那里编写的错误系统。
我是一名优秀的程序员,十分优秀!