2011-06-18 33 views
7

gcc (GCC) 4.6.0 GNU gdb (GDB) Fedora (7.2.90.20110525-38.fc15)Biểu tượng gỡ lỗi trông như thế nào?

thời gian gần đây tôi đã có một vấn đề khi tôi đã cố gắng để gỡ lỗi vấn đề của tôi sử dụng gdb. Khi tôi nạp nhị phân của tôi gdb phàn nàn "Không những biểu tượng gỡ lỗi đã được tìm thấy"

Vì vậy, khi tôi đã làm như sau:

nm ass1 

tôi có kết quả như sau (chỉ mẫu)

00000000006026e0 t __init_array_end 
00000000006026d0 t __init_array_start 
00000000004020e0 T __libc_csu_fini 
0000000000402050 T __libc_csu_init 
       U [email protected]@GLIBC_2.2.5 
00000000006029ec A _edata 
0000000000602b28 A _end 
000000000040212c T _fini 
0000000000401420 T _init 
0000000000401610 T _start 
       U [email protected]@GLIBC_2.2.5 
000000000040163c t call_gmon_start 
0000000000602b10 b completed.5886 
00000000006029e8 W data_start 
0000000000602b18 b dtor_idx.5888 
00000000004016d0 t frame_dummy 
00000000004016f4 T main 

Các vấn đề là tôi quên thêm -g. Vì vậy, tôi quyết định biên dịch với -g và chạy nm một lần nữa. Tôi có một đầu ra simliar, điều này có chứa các biểu tượng gỡ lỗi như tôi đã sử dụng -g, và gdb không phàn nàn thời gian này:

    U [email protected]@GLIBC_2.2.5 
00000000006029ec A _edata 
0000000000602b28 A _end 
000000000040212c T _fini 
0000000000401420 T _init 
0000000000401610 T _start 
       U [email protected]@GLIBC_2.2.5 
000000000040163c t call_gmon_start 
0000000000602b10 b completed.5886 
00000000006029e8 W data_start 
0000000000602b18 b dtor_idx.5888 
00000000004016d0 t frame_dummy 
00000000004016f4 T main 
       w pthread_cancel 

Ngoài kích thước lớn hơn. Tôi có thể nhận thấy bất kỳ khác nhau bằng cách sử dụng nm. Tôi tự hỏi tôi nên tìm gì? Các biểu tượng gỡ lỗi trông như thế nào?

Rất cám ơn cho bất cứ đề nghị,

Trả lời

7

nm ẩn những biểu tượng debug theo mặc định. Sử dụng tùy chọn -a để hiển thị chúng.

Hệ thống hiện đại thường không sử dụng các biểu tượng gỡ lỗi mỗi giây. Định dạng gỡ lỗi stabs được phát triển để sử dụng với các tệp thi hành định dạng a.out, chỉ có thể đại diện cho một số lượng giới hạn cấu trúc bên trong; điều này dẫn đến việc ẩn khá nhiều thứ trong bảng biểu tượng, chẳng hạn như các biểu tượng gỡ lỗi và initializers/constructors. Các định dạng tệp COFF (hiện nay chủ yếu là lỗi thời) và ELF cho phép sử dụng các phần tùy ý và hầu hết các bản phân phối Linux hiện đại cấu hình gcc để sử dụng thông tin gỡ lỗi DWARF 2. Bạn có thể sử dụng GNU objdump để kiểm tra thông tin đó.

(Tôi không xuất hiện để có quyền truy cập vào một máy mà binutils sẽ tạo stabs hoặc định dạng GNU stabs+, vì vậy tôi sẽ hoãn đến Google cho các chi tiết.)

+0

Tôi đã làm điều đó với -a với cả hai trường hợp biên dịch có và không có -g. Tuy nhiên, tôi nhận được rất nhiều biểu tượng, nhưng cái nào là biểu tượng gỡ lỗi? Cảm ơn. – ant2009

+0

Lemme chú thích. Bạn có thể không có bất kỳ biểu tượng nào cả; Linux thường sử dụng thông tin gỡ lỗi DWARF 2, được lưu trữ trong các phân đoạn ELF khác thay vì bảng biểu tượng (sau này là một sự lưu giữ từ định dạng 'a.out' giới hạn). – geekosaur

Các vấn đề liên quan