2010-11-01 57 views
10

Tôi đang làm việc trên C/C++ trên UNIX và thường thấy các tệp lõi. Nhiều lần các tệp lõi khó gỡ lỗi để tìm nguyên nhân thực sự của lõi hoặc lỗi phân đoạn. Bạn có thể gợi ý cho tôi một trình gỡ lỗi hiệu quả không?Công cụ gỡ lỗi tốt nhất cho C và C++

+3

Bạn đang sử dụng trình biên dịch nào? Trình gỡ rối cần đọc các biểu tượng gỡ lỗi được trình biên dịch của bạn tạo ra. Nói chung gdb đi tốt nhất với gcc, dbx với Sun CC, vv – Rup

+0

Tôi đang sử dụng cc trên UNIX –

+1

Sachin: Điều đó không thực sự cho chúng ta biết nhiều. 'Cc' nào? UNIX nào? – Ken

Trả lời

8

Tôi nghĩ rằng hầu hết các trình biên dịch C trên hầu hết các hương vị của * nix hỗ trợ -g bao gồm gỡ lỗi những biểu tượng trong các tập tin đối tượng, vì vậy nếu bạn làm:

cc -g -c file1.c 
cc -g -c file2.c 
cc -g file1.o file2.o -o program 
./program 

Sau đó, khi bạn chạy chương trình nếu nó bị treo nó nên tạo ra một dễ dàng sửa lỗi tệp lõi. Hai dòng đầu tiên chỉ biên dịch các tệp nguồn (tạo các tệp .o), dòng thứ ba yêu cầu trình biên dịch gọi trình liên kết để liên kết các tệp nguồn vào tệp thực thi (đi qua -g ở đây có thể không thực sự làm bất cứ điều gì nếu trình liên kết không phải làm bất cứ điều gì đặc biệt để tạo ra một tập tin thực thi với các biểu tượng gỡ lỗi, nhưng nó không làm tổn thương bất cứ thứ gì), và dòng cuối cùng chạy chương trình. Bạn nên đảm bảo rằng bạn không yêu cầu trình biên dịch thực hiện tối ưu hóa khi bạn đang cố gắng gỡ lỗi (trừ khi bạn thấy rằng nó không có lỗi trừ khi tối ưu hóa được bật) vì tối ưu hóa thường làm cho khó theo dõi hơn.

Vì tôi không biết bạn đang sử dụng nền tảng nào hay bạn có sẵn công cụ gì (hoặc thực sự là trình biên dịch C bạn đang sử dụng) nên khó đưa ra lời khuyên cụ thể hơn. Bạn nên đọc trang hướng dẫn sử dụng (thủ công) cho trình biên dịch của bạn. Từ loại dòng lệnh:

man cc 

Và điều đó sẽ hiển thị trang hướng dẫn cho bạn biết nhiều điều về trình biên dịch trên hệ thống của bạn. Điều này có thể cho bạn biết làm thế nào để cho trình biên dịch tạo ra nhiều thông điệp cảnh báo hơn, điều này có thể giúp bạn tìm ra lỗi của mình trước khi chạy chương trình của bạn. (lưu ý rằng một số cảnh báo chỉ có thể được tạo nếu bạn biên dịch với một số tối ưu hóa được bật, vì vậy, có thể bạn sẽ không muốn gỡ lỗi chương trình được tối ưu hóa mà bạn có thể muốn biên dịch nó với tối ưu hóa và cảnh báo bổ sung được bật để xem chúng có cho bạn biết bất cứ điều gì).

Hệ thống Unix của bạn có thể đã cài đặt một số loại trình gỡ rối. Hầu hết các máy Linux được thiết lập để phát triển C có cài đặt gdb. gdb có thể được sử dụng để chạy chương trình của bạn ở chế độ gỡ lỗi hoặc để phân tích tệp lõi.Nếu bạn có gdb, bạn có thể:

gdb ./program 

nó sẽ bắt đầu sẵn sàng để chạy chương trình của bạn. Nếu bạn làm như vậy:

gdb ./program ./core 

nó sẽ hoạt động tương tự trừ trường hợp bạn đang gỡ lỗi và chương trình của bạn bị lỗi. Từ trạng thái này điều nhanh nhất và hữu ích nhất mà bạn có thể làm là

(gdb) bt 

Đây (gdb) là nhanh chóng và bt là một lệnh mà nói để tạo ra một back-trace. Điều đó có nghĩa là ngăn xếp cuộc gọi, hiển thị chức năng của chương trình khi xảy ra lỗi và chức năng nào được gọi là chức năng đó, và chức năng nào được gọi là chức năng đó, và bật và lên đến hàm đầu tiên. Điều này có thể gây nhầm lẫn bởi vì nó thường sẽ hiển thị các hàm thư viện như là hàm được gọi gần đây nhất, nhưng điều này thường có nghĩa là bạn đã truyền vào một số dữ liệu xấu ở đâu đó dọc theo cách gây ra sự cố.

gdb là một chương trình lớn và phức tạp, vì vậy nếu chương trình trên hệ thống của bạn, bạn nên dành thời gian đọc nó.

Nếu nó không có trên hệ thống của bạn thì bạn nên tìm ra những công cụ tương tự. Một số trình gỡ rối đồ họa (hoặc trong IDE hay không) hoạt động như giao diện người dùng và một số thậm chí còn hỗ trợ một số trình gỡ rối dòng lệnh khác nhau, vì vậy nếu bạn có thể sử dụng một trong những trình gỡ rối đồ họa, bạn có thể không phải lo lắng về trình gỡ rối dòng lệnh cuối thực tế đang được sử dụng.

2

Nói chung, gdb là trình gỡ lỗi tuyệt vời (mặc dù phải mất một chút thời gian để tìm hiểu). Ngoài ra còn có nhiều giao diện người dùng khác nhau, một số có giao diện đồ họa, chẳng hạn như DDD hoặc cgdb.

Nếu bạn giải thích cụ thể nơi bạn đang gặp sự cố, chúng tôi có thể đề xuất tốt hơn trình gỡ lỗi nào sẽ giúp bạn nhiều nhất.

7

Sử dụng gdb. Nó là trình gỡ lỗi Unix C/C++ tiêu chuẩn của defacto và kể từ phiên bản 7.0 có các tính năng gỡ lỗi đảo ngược (bạn có thể quay ngược thời gian). Những lý do này một mình làm cho nó ít nhất là đáng giá để kiểm tra xem nó ra.

10

Đối với lỗi phân đoạn, rò rỉ bộ nhớ, dữ liệu chưa được khởi tạo và như vậy, hãy chạy chương trình của bạn qua valgrind luôn là ý tưởng hay. Nếu bạn đặc biệt quan tâm đến rò rỉ bộ nhớ, tùy chọn "--leak-check = full" sẽ trả hết.

Và có, hãy tìm hiểu gdb. Phải mất một ít thời gian, nhưng nó đáng giá.

+0

Lưu ý đây là điều bạn sẽ làm nếu bạn có cách nhất quán để tái tạo lõi và muốn xác định nguyên nhân. valgrind không xử lý các tệp lõi đã được tạo. – aschepler

3

Tôi thực sự thích Totalview. Các tính năng gỡ lỗi song song là những gì làm cho tôi thích nó nhiều như tôi làm.

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