2014-03-04 24 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 

或類似帶參數的測試。