2011-11-29 7 views
95

chương trình của tôi hoạt động như thế này:Làm thế nào để phân tích tệp kết xuất lõi của chương trình với gdb?

exe -p param1 -i param2 -o param3 

Nó bị rơi và tạo ra một tập tin lõi bãi core.pid

Tôi muốn phân tích các tập tin lõi bãi bởi

gdb ./exe -p param1 -i param2 -o param3 core.pid 

nhưng gdb nhận thì các tham số của exe dưới dạng đầu vào của gdb.

Cách phân tích tệp kết xuất lõi trong trường hợp này?

+1

Bạn có chắc chắn 'exe' không phải là tập lệnh hệ vỏ (để đặt một số biến, v.v.) như ví dụ: 'firefox' có trên Linux không? –

+1

http://unix.stackexchange.com/questions/89933/how-to-view-core-files-for-debugging-purposes-in-linux/202443#202443 –

Trả lời

121

Bạn có thể sử dụng lõi với gdb theo nhiều cách, nhưng chuyển các tham số được chuyển đến thực thi cho gdb không phải là cách để sử dụng tệp lõi. Đây cũng có thể là lý do bạn gặp lỗi đó. Bạn có thể sử dụng các tập tin cốt lõi trong cách sau:
gdb <executable> <core-file> hoặc gdb <executable> -c <core-file> hoặc

gdb <executable> 
... 
(gdb) core <core-file> 

Khi sử dụng tập tin lõi bạn không cần phải vượt qua đối số. Kịch bản tai nạn được hiển thị trong gdb (được kiểm tra bằng gdb Phiên bản 7.1 trên Ubuntu). Ví dụ:

$ ./crash -p param1 -o param2 
Segmentation fault (core dumped) 
$ gdb ./crash core 
GNU gdb (GDB) 7.1-ubuntu 
... 
Core was generated by `./crash -p param1 -o param2'. <<<<< See this line shows crash scenario 
Program terminated with signal 11, Segmentation fault. 
#0 __strlen_ia32() at ../sysdeps/i386/i686/multiarch/../../i586/strlen.S:99 
99 ../sysdeps/i386/i686/multiarch/../../i586/strlen.S: No such file or directory. 
    in ../sysdeps/i386/i686/multiarch/../../i586/strlen.S 
(gdb) 

Nếu bạn muốn truyền tham số để thực thi để được sửa lỗi trong gdb sử dụng --args.
Ví dụ:

$ gdb --args ./crash -p param1 -o param2 
GNU gdb (GDB) 7.1-ubuntu 
... 
(gdb) r 
Starting program: /home/@@@@/crash -p param1 -o param2 

Program received signal SIGSEGV, Segmentation fault. 
__strlen_ia32() at ../sysdeps/i386/i686/multiarch/../../i586/strlen.S:99 
99 ../sysdeps/i386/i686/multiarch/../../i586/strlen.S: No such file or directory. 
    in ../sysdeps/i386/i686/multiarch/../../i586/strlen.S 
(gdb) 

trang Man sẽ rất hữu ích để xem các tùy chọn gdb khác.

20

Chỉ cần bỏ qua params, gdb không cần đến chúng:

gdb ./exe core.pid 
+0

Nhưng điều này không hiệu quả. Cảnh báo đầu ra gdb: tệp lõi có thể không khớp với tệp thực thi được chỉ định. Không đọc được tệp hình ảnh đối tượng hợp lệ từ bộ nhớ. – Treper

+4

"tệp lõi có thể không khớp với tệp thực thi được chỉ định". Bạn đã sửa đổi exe sau khi nó tạo ra lõi? Bạn có lẽ xây dựng lại nó với các tùy chọn dòng lệnh khác nhau không? Nó là rất quan trọng để cung cấp cho GDB * chính xác * cùng một nhị phân sản xuất lõi. Nếu không, bạn sẽ bị đổ rác. –

+2

Cũng đảm bảo rằng nhị phân được truyền tới gdb không bị tước. Bạn có thể chạy 'tập tin ' cho thấy nó bị tước hay không. –

9

Từ RMS's gdb Debugger Tutorial:

prompt > myprogram 
Segmentation fault (core dumped) 
prompt > gdb myprogram 
... 
(gdb) core core.pid 
... 

Hãy chắc chắn rằng tập tin của bạn thực sự là một hình ảnh core - kiểm tra nó bằng cách sử file.

+2

Hướng dẫn của anh ấy khá tốt. Tuy nhiên, kể từ ngày 30/11/16, trang web của anh ấy không có ở đó. Nó có thể quay lại, nhưng trong thời gian chờ đợi, bạn có thể xem hướng dẫn của mình trên Máy Wayback: https://web.archive.org/web/20161015015746/http://www.unknownroad.com/rtfm/gdbtut/gdbtoc. html –

1

Bạn có thể phân tích tệp kết xuất lõi bằng lệnh "gdb".

gdb - The GNU Debugger 

syntax: 

# gdb executable-file core-file 

ex: # gdb out.txt core.xxx 

Cảm ơn.

16

sử dụng đơn giản của GDB, để gỡ lỗi coredump file:

gdb <executable_path> <coredump_file_path> 

tập tin coredump cho một "quá trình" được tạo ra, như tập tin "core.pid". Sau khi bạn vào trong dấu nhắc gdb, (trên thực thi lệnh trên), gõ;

... 
(gdb) where 

Điều này sẽ giúp bạn có được thông tin, ngăn xếp, nơi bạn có thể làm hư hỏng nguyên nhân gây ra lỗi/lỗi. Lệnh khác, cho các mục đích tương tự;

... 
(gdb) bt full 

Điều này tương tự như trên.Theo quy ước, nó liệt kê toàn bộ thông tin ngăn xếp (cuối cùng dẫn đến vị trí tai nạn).

6

Cách tiếp cận hơi khác sẽ cho phép bạn bỏ qua toàn bộ GDB. Nếu tất cả những gì bạn muốn là một backtrace, tiện ích linux 'catchsegv' sẽ bắt SIGSEGV và hiển thị một backtrace.

0

Đơn giản chỉ cần gõ lệnh

$ gdb <Binary> <codeDump> 

hoặc

$ gdb <binary> 

$ gdb) core <coreDump> 

Không cần phải cung cấp bất kỳ đối số dòng lệnh. Đoạn mã được tạo ra do tập thể dục trước đó.

2

Nó không quan trọng thực thi có đối số hay không, Để chạy GDB trên bất kỳ nhị phân với một tệp lõi tạo ra Cú pháp là dưới đây.

Syntax: 
gdb <binary name> <generated core file>  
Eg: 
gdb l3_entity 6290-corefile  

hãy để tôi lấy ví dụ bên dưới để hiểu rõ hơn.

bash-4.1$**gdb l3_entity 6290-corefile** 

**Core was generated** by `/dir1/dir2/dir3/l3_entity **Program terminated with signal SIGABRT, Aborted.** 
#0 
#1 
#2 
#3 
#4 
#5 
#6 
#7 
#8 
#9 
#10 
(gdb) 

Từ đầu ra ở trên, bạn có thể đoán điều gì đó về cốt lõi cho dù đó là một truy cập NULL hoặc SIGABORT vv ..

Những con số # 0 đến # 10 là khung stack của GDB. Các khung ngăn xếp này không phải là tệp nhị phân của bạn. trong 0 trên - 10 khung hình nếu bạn nghi ngờ bất cứ điều gì sai chọn mà khung

(gdb) frame 8 

Bây giờ để xem thêm chi tiết về nó:

(gdb) list + 

Để điều tra vấn đề hơn nữa bạn có thể in các giá trị bị nghi ngờ biến tại đây thời điểm này.

(gdb) print thread_name