2012-01-23 33 views
5

Tôi đã được hỏi trong một cuộc phỏng vấn cách bạn có thể gỡ lỗi lỗi phân đoạn trong chương trình C bằng GDB.Làm cách nào để tìm lỗi phân đoạn từ nhiều tệp bằng GDB

Tôi đã nói với họ rằng chúng tôi có thể biên dịch chương trình của chúng tôi với tùy chọn -g để thêm thông tin gỡ lỗi vào tệp nhị phân và có thể đọc tệp kết xuất lõi nhưng sau đó người phỏng vấn cho tôi biết nếu chúng tôi có 3 đến 4 tệp được biên dịch cùng nhau. lỗi phân đoạn thì làm cách nào để chúng tôi gỡ lỗi trong GDB?

+0

Trừ khi tôi thực sự hiểu lầm những gì bạn đang yêu cầu, bạn vẫn muốn biên dịch tất cả chúng với -g và gỡ lỗi trong chính xác cùng đường. –

+0

Tôi cũng cung cấp cho họ giải pháp tương tự nhưng họ không gây ấn tượng gì cả, những gì họ tranh cãi sẽ không cho chúng tôi biết tên tệp chính xác gây ra lỗi phân đoạn –

+1

Thực ra, trong tất cả các câu hỏi phỏng vấn tôi đã thấy ở đây, cái này thực sự khá hợp lý. Làm cho tinh thần để kiểm tra xem một nhà phát triển biết làm thế nào để sử dụng bất cứ trình gỡ rối có sẵn trên nền tảng tương ứng. –

Trả lời

0

Có vẻ như họ đang tìm cách thiết lập để bạn có thể duyệt qua mã khi nó đang chạy, bạn có thể làm điều này với phiên bản dòng lệnh hoặc tôi nghĩ bạn có thể có GUI cho GDB.

1

Nếu bạn đang làm việc dưới Linux, cách dễ dàng hơn để tìm lỗi phân đoạn là sử dụng công cụ có tên VALGRIND: http://valgrind.org/.

Bạn chỉ cần biên dịch mã của mình bằng cờ -g và sau đó chạy ./valgrind.

Sau đó, bạn sẽ biết chính xác chức năng nào và trong đó dòng mã nào có bộ nhớ/bộ nhớ bị lỗi không xác định được đọc ra khỏi không gian được phân bổ hoặc sth.

3
$ gcc -ggdb s1.c s2.c s3.c -o myprog 
$ gdb myprog 
(gdb) run --arg1 --arg2 

GDB sẽ chạy chương trình như bình thường, khi lỗi phân đoạn xảy ra GDB sẽ quay trở lại lời nhắc và nó sẽ gần giống như chạy GDB với tệp lõi. Sự khác biệt chính là có một số điều bạn không thể làm/in với một tập tin lõi mà bạn có thể khi chương trình đã bị rơi bên trong GDB. (Bạn có thể sử dụng print để gọi một số chức năng bên trong chương trình, ví dụ.)

Bạn cũng có thể đính kèm vào chương trình đang chạy bằng cách sử dụng gdb --pid <the programs pid>. Hoặc là với tệp lõi hoặc với một trong các phương pháp trên, khi bạn có lời nhắc GDB sau sự cố, hãy nhập backtrace (hoặc bt để viết tắt) và GDB sẽ hiển thị cho bạn ngăn xếp tại thời điểm xảy ra sự cố, bao gồm tên tệp và số dòng của mỗi cuộc gọi và dòng hiện đang thực thi.

+0

Tôi nghĩ chúng ta nên sử dụng "gcc -g", ý nghĩa của "gcc -ggdb" –

+0

[Hướng dẫn] (https://gcc.gnu.org/onlinedocs/gcc-4.9.2/gcc/Debugging-Options) .html # Debugging-Options) giải thích ... -ggdb có thể tạo thêm thông tin cho GDB mà -g không. Nếu bạn định sử dụng GDB, bạn sẽ sử dụng -ggdb. – SoapBox

+0

nhờ SoapBox :) –

1

Bạn chỉ cần chạy chương trình dưới gdb, và trình gỡ rối với bắt SIGSEGV và hiển thị cho bạn dòng và hướng dẫn bị lỗi. Sau đó, bạn chỉ cần kiểm tra biến và/hoặc đăng ký các giá trị để xem có gì sai. Thông thường nó là một giá trị con trỏ giả mạo, và cố gắng truy cập nó với GDB sẽ cho và lỗi, vì vậy nó rất dễ dàng.

Và có, biên dịch lại mọi thứ bằng -g sẽ hữu ích. Người phỏng vấn có thể muốn bạn mô tả cách bạn sẽ tìm ra tệp nào có lỗi (gdb chỉ cho bạn biết khi nào nó bắt tín hiệu) và chỉ biên dịch lại tệp đó bằng thông tin gỡ lỗi. Nếu có 20.000 tệp nguồn có thể hữu ích, nhưng với 3 hoặc 4 tệp, điểm là gì? Ngay cả với các dự án lớn hơn, bạn thường kết thúc theo đuổi con trỏ xấu thông qua 10 hàm và 5 tệp, vì vậy một lần nữa, điểm là gì? Thông tin gỡ lỗi không chi phí bất cứ điều gì trong thời gian chạy, mặc dù nó tốn không gian đĩa trong một cài đặt.

+0

Tại sao lại là downvote? – ams

1

biên dịch mã theo cách bình thường bằng cách cho gcc filename bạn sẽ nhận được một tập tin .out, bắt đầu chạy đó và nhận quá trình id bằng cách cho ps -aef | grep filename.out

trong một loại cửa sổ khác gdb và nhập, bên trong gdb Hãy cho kịp thời attach processid (processid bạn sẽ nhận được từ lệnh trên), cung cấp cho c để tiếp tục.once thực hiện kết thúc cho "bt" bên trong gdb.you sẽ nhận được nơi phân đoạn xảy ra.

0

người ta có thể sử dụng các bước sau để lỗi segmentation debug sử dụng gdb

$ gdb <exec name > 
$ r   //run the pgm 
$ where 
$ f <1> <0> //to view the function n variables 

$ list 

$ p <variable>  
Các vấn đề liên quan