2013-06-07 34 views
8

Câu hỏi cơ bản & Tôi rất mới đối với C/C++ và GDB.cách GDB biết nó phải phá vỡ tại điểm ngắt được chỉ định?

Chúng tôi sử dụng GDB để gỡ lỗi quy trình. Chúng tôi đính kèm GDB vào một quy trình và sau đó chỉ định filename.c cùng với số dòng để đặt điểm ngắt.

Câu hỏi của tôi là "GDB hoặc OS HOẶC có thể bất cứ điều gì khác biết rằng nó phải phá vỡ số dòng đã chỉ định (trong tên tệp.c) sau khi chúng tôi kết nối GDB với quy trình đang chạy?"

Điều gì sẽ xảy ra trong quá trình xử lý hiện tại đang chạy trong chế độ gỡ lỗi và điểm ngắt được áp dụng và quá trình thực thi phải ngắt (chờ đầu vào của người dùng) tại điểm đó?

+0

Hãy xem [ptrace (2)] (http://linux.die.net/man/2/ptrace) – nouney

+1

@nouney: Đó sẽ là cơ sở tốt cho câu trả lời hay. –

Trả lời

6

Tôi không thể nhận xét phiên bản gdb mới nhất - nhưng nhiều trình gỡ rối thực sự trao đổi hướng dẫn lắp ráp tại vị trí điểm ngắt mong muốn (trong bộ nhớ) bằng lệnh ngắt. Điều này "tỉnh dậy" trình gỡ rối kiểm soát tại thời điểm này.

Sử dụng lệnh ngắt được thay thế có nghĩa là CPU có thể thực thi chương trình của bạn ở tốc độ tối đa và "tăng tốc" ở vị trí mong muốn. Tuy nhiên,

Bộ vi xử lý hiện đại rất phức tạp và có thể có các tính năng gỡ lỗi vượt trội hơn nhiều.

-2

Nếu bạn đã sử dụng tùy chọn -g trong gcc/g ++, số dòng của mỗi tệp nguồn được đính kèm theo hướng dẫn trong tệp đối tượng kết quả.

9

Cùng một cách mà nếu chương trình của bạn dừng hoặc treo tại một điểm cụ thể, trình gỡ lỗi có thể cho bạn biết vị trí của chương trình tại điểm đó.

Đối với cả hai để làm việc theo chương trình nhị phân phải chứa thông tin gỡ lỗi bổ sung mà liên kết các địa chỉ trong hình ảnh chương trình với các địa điểm trong mã nguồn (file nguồn và số dòng.)

Để thêm một breakpoint tại một đặc biệt dòng trình gỡ rối tìm địa chỉ chương trình gần nhất với dòng đó, sửa đổi bản sao của tệp thực thi trong bộ nhớ để chèn một lệnh "break" đặc biệt tại vị trí đó sẽ làm cho chương trình bị gián đoạn, sau đó "theo dõi" để nó đạt đến điểm dừng và dừng lại.

Để biết thêm chi tiết, xem http://eli.thegreenplace.net/2011/01/23/how-debuggers-work-part-1/http://www.howzatt.demon.co.uk/articles/SimplePTrace.html

+3

Trên nhiều kiến ​​trúc (ví dụ: x86) thanh ghi gỡ lỗi cho phép một (vài) điểm ngắt được thiết lập mà không sửa đổi văn bản chương trình. –

+0

Tôi không biết điều đó, cảm ơn (và cảm ơn bạn đã chỉnh sửa) –

1

GDB là nhận thức của mã của bạn: nó biết tất cả về nó. Khi bạn đặt điểm ngắt tại một dòng, GDB nhận địa chỉ hướng dẫn máy tương đương: tất cả mã của bạn (như hướng dẫn máy) được tải trong bộ nhớ, vì vậy hướng dẫn mã của bạn có địa chỉ.

Vì vậy, bây giờ GDB biết địa chỉ của lệnh bạn muốn ngắt. Khi bạn chạy chương trình của mình, GDB sẽ sử dụng ptrace, cho phép GDB "xem" từng hướng dẫn trước khi thực thi. Sau đó, GDB chỉ cần xem xét nếu lệnh hiện tại (sẽ được thực hiện) là giống như hướng dẫn của bạn (mà bạn muốn phá vỡ).

+0

Phương pháp bạn đã mô tả là có thể, nhưng rất chậm (1000x hoặc hơn) để không sử dụng được trong thực tế. Đó không phải là cách các trình gỡ rối có thể sử dụng * thực sự * hoạt động. –

+0

Tôi đồng ý ... nó sẽ quá chậm – Gana

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