2009-02-02 51 views
39

Có bất kỳ tùy chọn gcc nào tôi có thể đặt cho tôi số dòng của lỗi phân đoạn không?Số dòng lỗi phân đoạn

Tôi biết tôi có thể: dòng

  1. gỡ lỗi bởi dòng
  2. printfs Đặt trong mã để thu hẹp.

Chỉnh sửa:

  1. bt/where trên gdb cho Không stack.
  2. Helpful suggestion
+0

bạn có thể đăng cờ biên dịch của mình không? – cbrulak

+0

gcc -DDEBUG -I "" -O0 -g3 -Wall -c -fmessage-length = 0 -MMD -MP – Rohit

+0

(lần sau, hãy đặt mã của bạn trong câu hỏi của bạn). – cbrulak

Trả lời

54

Tôi không biết một tùy chọn gcc, nhưng bạn sẽ có thể chạy các ứng dụng với gdb và sau đó khi nó bị treo, gõ where để có một cái nhìn tại các stack khi nó thoát, mà sẽ giúp bạn gần gũi.

$ gdb blah 
(gdb) run 
(gdb) where 

Chỉnh sửa cho đầy đủ:

Bạn cũng nên chắc chắn để xây dựng ứng dụng với cờ gỡ lỗi trên bằng cách sử dụng tùy chọn gcc -g để bao gồm số dòng trong thực thi.

Tùy chọn khác là sử dụng lệnh bt (backtrace).

+2

Tôi phải làm gì nếu hiển thị "Không có ngăn xếp" ở đâu? – Rohit

+0

Một số sự cố có thể làm hỏng nội dung nguyên vẹn và sau đó bạn có thể là tốt nhất với chèn printf và kiểm tra tính hợp lệ của đầu vào tại các điểm mã khác nhau. – che

+2

bạn cũng có thể thử đề nghị của tôi dưới đây - nó sử dụng thói quen thư giãn stack glibc để in bạn ra một stacktrace w/o phải nghỉ mát để gdb. – tgamblin

4

bạn cũng cần phải xây dựng với cờ debug trên -g

Bạn cũng có thể mở các bãi chứa lõi với gdb (bạn cần -g dù).

+0

Brulak là địa điểm, nếu bạn không nhận được một ngăn xếp trong gdb, bạn cần phải sửa chữa các biểu tượng của bạn –

1

Không có phương pháp nào để GCC cung cấp thông tin này, bạn sẽ phải dựa vào một chương trình bên ngoài như GDB.

GDB có thể cung cấp cho bạn dòng nơi xảy ra sự cố với lệnh "bt" (viết tắt của "backtrace") sau khi chương trình bị lỗi seg. Điều này sẽ cung cấp cho bạn không chỉ các dòng của vụ tai nạn, nhưng toàn bộ ngăn xếp của chương trình (vì vậy bạn có thể xem những gì được gọi là chức năng nơi vụ tai nạn xảy ra).

19

Dưới đây là hoàn tất một phiên vỏ/gdb

 
$ gcc -ggdb myproj.c 
$ gdb a.out 
gdb> run --some-option=foo --other-option=bar 
(gdb will say your program hit a segfault) 
gdb> bt 
(gdb prints a stack trace) 
gdb> q 
[are you sure, your program is still running]? y 
$ emacs myproj.C# heh, I know what the error is now... 

Chúc mừng hack :-)

+2

bt và nơi cho "Không có ngăn xếp". Làm cách nào để khắc phục điều đó? – Rohit

+5

bạn chạy nó trên máy tính của tôi ;-) [xin lỗi] –

9

Bạn có thể nhận gcc để in bạn một stacktrace khi chương trình của bạn nhận được một tín hiệu SEGV, tương tự như cách Java và khác ngôn ngữ thân thiện xử lý các ngoại lệ con trỏ null. Xem câu trả lời của tôi ở đây để biết thêm chi tiết:

Những điều tốt đẹp về việc này là bạn chỉ có thể để nó trong mã của bạn; bạn không cần phải chạy mọi thứ thông qua gdb để có được kết quả gỡ lỗi tốt đẹp.

Nếu bạn biên dịch bằng -g và làm theo hướng dẫn ở đó, bạn có thể sử dụng công cụ dòng lệnh như addr2line để nhận thông tin về tệp/dòng từ đầu ra.

+0

Liên kết bị hỏng ... phần được sửa là: http://stackoverflow.com/questions/77005/how-to-generate-a-stacktrace-when- my-gcc-c-app-crashes –

3

Nếu tất cả những gợi ý trước để biên dịch với gỡ lỗi (-g) và chạy theo một trình gỡ lỗi (gdb, chạy, bt) không làm việc cho bạn, sau đó:

  • tiểu: Có thể bạn không chạy dưới trình gỡ lỗi, bạn chỉ đang cố gắng phân tích kết xuất lõi sau khi tải lên. (Nếu bạn bắt đầu một phiên gỡ rối, nhưng không chạy chương trình, hoặc nếu nó thoát, thì khi bạn yêu cầu một backtrace, gdb sẽ nói "No stack" - bởi vì không có chương trình đang chạy nào cả. Nếu nó bị phân đoạn, đừng quên thêm đối số thứ ba (core) khi bạn chạy gdb, nếu không bạn bắt đầu trong cùng một trạng thái, không được gắn với bất kỳ quá trình cụ thể hoặc hình ảnh bộ nhớ nào.
  • Khó khăn: Nếu chương trình của bạn là/đã thực sự chạy nhưng gdb của bạn đang nói "Không ngăn xếp" có lẽ con trỏ ngăn xếp của bạn bị hỏng nặng. Trong trường hợp đó, bạn có thể là một vấn đề tràn bộ đệm ở đâu đó, đủ nghiêm trọng để nghiền nát hoàn toàn trạng thái thời gian chạy của bạn. GCC 4.1 hỗ trợ ProPolice "Stack Smashing Protector" được kích hoạt với -fstack-protector-all. Nó có thể được thêm vào GCC 3.x với một bản vá.
1

Sự cố No stack dường như xảy ra khi chương trình thoát thành công.

Để lưu nội dung, tôi gặp sự cố này vì tôi đã quên mã trả về, điều này làm cho chương trình của tôi bị thoát với mã lỗi.