- 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/
假设我定义了一个 new gdb command其中包括别名。 import gdb import string class PrettyPrintString (gdb.Command):
是否可以使用 gdb 的 if 或 while 条件来测试 gdb 命令是否成功(而不是查询程序值或变量)? 现在为了清楚起见,我谈论的是 gdb 内置命令(即当您在 gdb 中键入 help 时出现
我只是使用 gdb 逐行逐行执行代码,以了解它是如何工作的以及它在做什么。我第一次这样做时效果很好,但现在下一个命令无法正常工作。有时它前进,有时它倒退。这没有意义。每次我这样做似乎都是相同的模式。下
我怎样才能运行类似 gdb -e path/to/exe -ex 'run --argnamae argvalue' 的东西? 让我们假设在过去一两年内有一个最新版本的 gfb。 Gdb 运行并打印响
我正在使用 gdb 调试程序,并且我想要命令的输出 $(perl -e 'print "A"x20') 作为我的论点。我怎样才能做到这一点?这样,论点将非常灵活。 最佳答案 您可以使用 run 命令,
我在 linux 上使用 gdb 版本 7.5.1,并试图使用诸如 $_memeq 之类的便利功能只是发现它显然不存在: Undefined command: "$_memeq". Try "help
我有: 正在运行的剥离二进制文件 总局 未剥离的二进制文件 我可以连接到运行剥离的二进制文件 (gdp -p PID)。如何将未剥离二进制文件中的符号提供给连接到正在运行的进程的 gdb? 最佳答案
我偶然发现了gdb的自动显示功能,该功能非常强大且方便。打电话后 (gdb) display/i $pc (gdb) display $rax 监视的值将在每个步骤后自动显示: (gdb) si 0x
我知道 Linux 等现代操作系统并不总是在应用程序最初链接的同一地址执行应用程序。但是,当调试器开始四处查看时,它需要知道原始链接地址和最终执行地址之间的关系。 GDB如何计算偏移量? 澄清:我不是
我想知道是否有可能从GDB本身获取已调试应用程序已打开但未关闭的文件/目录的列表? 当前,我设置了一个断点,然后使用lsof这样的外部程序来检查打开的文件。 但是这种方法确实很烦人。 环境:Debia
我想执行非常简单的命令 print var1, var2, var3, var4 在 gdb 中不时检查变量的值。 我不想使用显示,因为它会扰乱我的 View 。 我该如何做到这一点?现在我能做的就是
这个问题已经有答案了: gdb scripting: execute commands at selected breakpoint (1 个回答) 已关闭 8 年前。 我需要检查一个变量以确定它是否
在命令行下,我知道使用 echo $?给我退出代码。在gdb中,我使用“r”来运行程序,程序终止,那么gdb是如何得到这个退出码的呢? gdb 里面有什么命令吗? 谢谢! 最佳答案 当程序退出时,gd
我遇到了核心,无法从中获取回溯。我有两个问题。 我可以从以下位置找出导致崩溃的行或崩溃发生的位置吗列出命令输出? 否则如何处理。我应该将 heuristic-fence-post 设置为多少才能得到一
调试时加断点,运行bt可以看到栈帧。 通过运行信息寄存器选择帧时,可以看到特定帧上的寄存器值。 例如,考虑在第 5 帧设置断点。当断点被击中时,进入第 3 帧,可以看到查看寄存器值。 在第 5 帧设置
gdb 如何打印结构?来自 zengr 在 how does gdb work? 引用的“GDB 内部”文档看起来 GDB 使用 BFD 库从一个或多个符号表加载符号。如果是这种情况,gdb 怎么知道
我只是使用 gdb 逐行逐行执行代码,以了解它是如何工作的以及它在做什么。我第一次这样做时效果很好,但现在下一个命令无法正常工作。有时它前进,有时它倒退。这没有意义。每次我这样做似乎都是相同的模式。下
当我执行以下命令时,我得到不同的 function() 地址 (gdb) 中断函数() function() 0x804834a 处的断点 1。 (gdb) 打印函数() function() 0x8
我已经安装了 (OSX Mojave 10.14.6.) Eclipse CDT 和 GNU MCU Eclipse plugin最后 GNU Tools for ARM .我的目标是使用 GDB (
我必须对文件(main 和 functions)进行 cpp,然后让它们构建一个 exe 文件(代码)和两个目标文件(main.o 和 functions.o)。 如何从 gdb 命令行调试特定文件“
我是一名优秀的程序员,十分优秀!