2014-03-04 25 views
0

我刚刚转移到Ubuntu和新使用gdb和g ++。如果我的问题很愚蠢,请原谅我。gdb没有给出错误的完整描述

这是来自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 
+0

我想在冗长的设置会帮助,但它仍然是给相同的输出 – AbKDs

+0

前的调试工作(在二进制文件调试信息)。你的代码不起作用。 –

+0

用'rm -v * .o recpirocal'清理。重新编译所有的源代码。向我们展示您的编译命令。再次启动调试器。 –

回答

3

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

也,当你做 gdb reciprocal

注意如果有喜欢 loaded symbols from ... couldnot find symbols

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

+0

我使用-g符号,但仍然是相同的,任何其他建议 – AbKDs

+0

可以请你粘贴确切的输出,当你从你执行该程序的地方开始编写gdb互惠? –

+0

我已更新hav外观 – AbKDs

2

你应该与所有警告和调试信息进行编译,即

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

然后用

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

链接,以便在您的Makefile添加

CFLAGS= -Wall -g 

。另见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命令来了解如何到达此处。

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的预期输出(从史蒂文斯先生的文字),线A-d是你的实际输出。 A,本质上是相同的,它们都指定可执行文件的文件名,(1)是相对路径,(A)有完整路径。别担心。

B行......这是NORMAL,这是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 

或类似带参数的测试。