gdb没有给出错误的完整描述

时间:2014-03-04 11:04:49

标签: linux gdb g++

我刚刚转移到ubuntu并且新使用了gdb和g ++。如果我的问题很愚蠢,请原谅我。

这是来自Richard Stevens高级Linux编程。在文件夹名称中创建了三个文件 main.c

#include <stdio.h>
#include "reciprocal.hpp"
int main (int argc, char **argv)
{
  int i;
  i = atoi (argv[1]);
  printf ("The reciprocal of %d is %g\n", i, reciprocal (i));
  return 0;
}

reciprocal.cpp

#include <cassert>
#include "reciprocal.hpp"
double reciprocal (int i) {
  // I should be non-zero.
  assert (i != 0);
  return 1.0/i;
}

reciprocal.hpp

#ifdef __cplusplus
extern "C" {
#endif
extern double reciprocal (int i);

#ifdef __cplusplus
}
#endif

编译完成后,我运行了命令(gdb) reciprocal(gdb) run。我期待书中的内容

Starting program: reciprocal
Program received signal SIGSEGV, Segmentation fault.
__strtol_internal (nptr=0x0, endptr=0x0, base=10, group=0)
at strtol.c:287
287 strtol.c: No such file or directory.
(gdb)

但我得到了:

Starting program: /home/trafalgar/Desktop/reciprocal/reciprocal
warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7ffff7ffa000

Program received signal SIGSEGV , Segmentation fault.
0x00007ffff7a56ad4 in ?? () from /lib/x86_64-linux-gnu/libc.so.6

可能会发生什么不同。这是版本问题还是其他什么?

这是Makefile

reciprocal: main.o reciprocal.o
           g++ $(CFLAGS) -o reciprocal main.o reciprocal.o
main.o: main.c reciprocal.hpp
           gcc $(CFLAGS) -c main.c
reciprocal.o: reciprocal.cpp reciprocal.hpp
           g++ $(CFLAGS) -c reciprocal.cpp
clean:
      rm -f *.o reciprocal

3 个答案:

答案 0 :(得分:3)

你是如何编译程序的? use g++ -g programname.c

另外,当你这样做的时候 gdb reciprocal

注意是否有类似的消息 loaded symbols from ... 要么 couldnot find symbols

如果你得到类似于第二个代码语句的输出,那么问题是你没有使用-g符号。

答案 1 :(得分:2)

您应该编译所有警告和调试信息,即

 gcc -Wall -g -c main.c
 g++ -Wall -g -c reciprocal.cpp

然后链接

 g++ -g main.o reciprocal.o -o reciprocal

所以添加

CFLAGS= -Wall -g

Makefile中。另请参阅this

然后使用

运行调试器
 gdb reciprocal

然后使用set args 12命令将程序参数设置为(gdb)提示符 在run提示符

时,最后使用(gdb)启动已调试的程序

当然,如果您没有任何程序参数,argc为1且argv[1]NULL,则不应将其传递给atoi(3)

调试器工作得很好。 该错误出现在您的代码中。argc为1且argv[1]NULL时,您应该正确处理

如果在C库函数中遇到segmentation fault,请使用btbacktrace gdb命令来了解如何到达那里。

答案 2 :(得分:1)

一切正常,预期输出。

比较

1. Starting program: reciprocal
2. Program received signal SIGSEGV, Segmentation fault.
3. __strtol_internal (nptr=0x0, endptr=0x0, base=10, group=0)
4. at strtol.c:287
5. 287 strtol.c: No such file or directory.

A. Starting program: /home/trafalgar/Desktop/reciprocal/reciprocal
B. warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7ffff7ffa000
C. Program received signal SIGSEGV , Segmentation fault.
D. 0x00007ffff7a56ad4 in ?? () from /lib/x86_64-linux-gnu/libc.so.6

1-5行是你的预期输出(来自Stevens先生的文字),A-D行是你的实际输出。

第1行和第1行A,基本相同,它们都指定可执行文件的文件名,(1)是相对路径,(A)是完整路径。不用担心。

B行...这是正常的,这是gdb告诉您没有为库函数安装调试信息(不是您的代码,系统上的动态链接库)。

C行......与(2)相同,很容易。

D行......好吧,既然我们没有库函数的调试信息,它只能指出错误的最佳位置:libc.so.6(标准库函数,其中strtol是一个这样的)

基本上,D行与3-5行相似。如果没有安装/可用的调试信息,您将不会获得比此更多的信息。

但一切都按预期工作。你很好。

有关如何安装调试符号的帮助,请参阅此处:how-to-use-debug-libraries-on-ubuntu

不要害怕!你做得很棒。 (从技术上讲,错误在main.cpp的第6行,因为argv [1]几乎未定义,因为你没有提供参数,可能会让人感到困惑,因为atoi()经常在幕后用strtol()替换。 )

尝试:

gdb --args ./reciprocal 15

或类似于参数测试。