2012-11-16 46 views
9

Có cách nào để đặt điểm ngắt tại mỗi dòng trong mã bằng GDB không? Rõ ràng là tôi không muốn đánh b *addr cho mỗi dòng, vì vậy tôi tự hỏi nếu có một cách nhanh chóng để làm điều này.Đặt điểm ngắt trên mỗi dòng trong GDB

Chỉnh sửa Lưu ý rằng tôi đang chạy một tệp nhị phân được tạo bởi người khác và tôi không có quyền truy cập vào mã nguồn. Thật không may, nhị phân đó chưa được biên dịch với cờ -g. Vì vậy, tôi không thể chỉ đơn bước qua từng dòng trong mã.

Hơn nữa Sửa Như Jason chỉ ra dưới đây, bạn có thể bước thực đơn thông qua các mã chừng nào bạn sử dụng si hoặc ni, như trái ngược với chỉ đơn giản là s (bước) hoặc n (tiếp theo). Tuy nhiên, n hoặc s hoạt động tốt, nếu mã nguồn đã được biên dịch bằng -g, nhưng nó bước qua các dòng mã nguồn, trái ngược với bước qua từng lệnh lắp ráp như ni hoặc si thực hiện trong một tệp nhị phân đã được biên dịch mà không cần -g .

+0

Bạn muốn làm gì ở mọi bước? Đối với 'danh sách': http://stackoverflow.com/questions/4362581/get-gdb-to-do-a-list-after-every-step –

Trả lời

7

Sử dụng si (stepi) để hướng dẫn từng bước qua mã. Bạn có thể sử dụng ni (nexti) để bước qua các chức năng thư viện mà bạn không quan tâm. Nếu bạn vô tình bước vào một trong số chúng, finish sẽ đưa bạn trở lại thói quen ban đầu của bạn. Những người làm việc ở cấp độ này thường có gdb được đặt để hiển thị một số hướng dẫn sắp được thực thi, ví dụ: disp/3i $pc.

+0

Wow, một giải pháp đơn giản như vậy. Tôi đã sử dụng n và s, thay vì ni hoặc si. Hoạt động hoàn hảo. Tôi tò mò về cách GDB diễn giải ni vs n. Ngoài ra, disp/3i $ pc rất hữu ích. – smaccoun

+1

'next' sử dụng thông tin dòng nguồn từ thông tin gỡ lỗi để xác định phạm vi địa chỉ của một dòng nguồn. Dòng 10 có thể đi từ 0x100 đến 0x116, do đó trình gỡ lỗi (đằng sau hậu trường), hướng dẫn từng bước cho đến khi máy tính là 0x116. Các biến chứng bao gồm bước vào một hàm khác hoặc để lại hàm hiện tại (lệnh trả về, longjmp, exception throw) trong trường hợp bạn muốn ngừng thực hiện. Khi trình gỡ lỗi bước vào một cuộc gọi chương trình con, nó đặt một điểm ngắt trên hàm ban đầu của bạn và tiếp tục. Có rất nhiều thứ xảy ra đằng sau hậu trường. 'ni' là cấp thấp hơn. –

1

Bạn không thể đặt điểm ngắt trên dòng đầu tiên thực hiện và sau đó đi qua từng dòng? Điều này phụ thuộc vào những gì bạn đang cố gắng đạt được bằng cách thiết lập các điểm ngắt trên mỗi dòng. Nếu bạn muốn đánh giá các biểu thức, bạn có thể làm điều đó bằng cách làm theo logic của tôi (bước qua từng dòng).

+0

Điểm tốt. Bạn là chính xác, nhưng tôi quên nói rằng tôi đang chạy một nhị phân mà không được biên dịch với cờ -g. Tôi không có quyền truy cập vào mã nguồn, vì vậy, tôi không thể biên dịch lại với -g. Thật không may, điều đó không cho tôi một bước. Câu hỏi đã được chỉnh sửa để rõ ràng – smaccoun

0

PowerPC có hỗ trợ phần cứng cho breakpoint dao động, và cung cấp GCB:

break-range start end 

trong vòm đó. Vì vậy, tôi nghĩ rằng bạn chỉ có thể phá vỡ toàn bộ địa chỉ bộ nhớ hoặc toàn bộ phần văn bản (chưa được kiểm tra).

Lệnh không thành công trên x86.

Tài liệu: https://sourceware.org/gdb/onlinedocs/gdb.html#index-break_002drange-1548

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