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
- gỡ lỗi bởi dòng
- printfs Đặt trong mã để thu hẹp.
Chỉnh sửa:
bt
/where
trên gdb cho Không stack.- Helpful suggestion
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
Chỉnh sửa:
bt
/where
trên gdb cho Không stack.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).
Tôi phải làm gì nếu hiển thị "Không có ngăn xếp" ở đâu? – Rohit
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
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
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ù).
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 –
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).
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 :-)
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
bạn chạy nó trên máy tính của tôi ;-) [xin lỗi] –
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.
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 –
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 đó:
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.-fstack-protector-all
. Nó có thể được thêm vào GCC 3.x với một bản vá.Chạy dưới valgrind.
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.
bạn có thể đăng cờ biên dịch của mình không? – cbrulak
gcc -DDEBUG -I "" -O0 -g3 -Wall -c -fmessage-length = 0 -MMD -MP – Rohit
(lần sau, hãy đặt mã của bạn trong câu hỏi của bạn). – cbrulak