2010-08-14 35 views
15

Tôi sử dụng GDB lần đầu tiên. tôi chạyLàm cách nào để tạm dừng việc tiếp tục trong GDB

$ gdb 

sau đó tôi đang chạy

attach <mypid> 

sau đó tôi thấy rằng quá trình của tôi là bị mắc kẹt (mà có lẽ ok). Bây giờ tôi muốn nó tiếp tục chạy, vì vậy tôi chạy

continue 

và quá trình của tôi tiếp tục chạy nhưng từ đây tôi bị mắc kẹt nếu tôi muốn một lần nữa để xem chồng hiện tại của tôi dấu vết vv Tôi không thể thoát ra khỏi tiếp tục ... Tôi đã thử Ctrl - D v.v. nhưng không có gì hiệu quả đối với tôi ... (chỉ là phỏng đoán).

+0

Ctrl-c sẽ hoạt động. –

+0

tôi cũng đã thử CTRL-C nó không – Jas

+0

Bạn có ý nghĩa gì bởi bị mắc kẹt? Một vòng lặp vô hạn? Xem thêm: http://stackoverflow.com/questions/8702658/gdb-how-do-i-pause-during-loop-execution –

Trả lời

11

Bạn nên làm gián đoạn quá trình được đính kèm bởi gdb. Không làm gián đoạn chính gdb. Làm gián đoạn quá trình bằng cách ctrl-c trong thiết bị đầu cuối trong mà quá trình đã được bắt đầu hoặc gửi quá trình SIGINT bằng cách giết -2 procid. Với procid id của quá trình được đính kèm.

+1

Xấu hổ không có cách nào để thực hiện việc này từ máy chủ khi sử dụng gdbserver/client. – barkside

+0

Không muốn nói rõ ràng, nhưng nó sẽ chỉ hoạt động nếu chương trình không xử lý SIGINT. Nếu có một frenzy sigaddset trong main() hoặc một số init() ...;) – vesperto

4

Điều khiển + C trong quá trình gdb sẽ đưa bạn trở lại dấu nhắc lệnh.

+0

ctrl-c không hoạt động cho tôi, vui lòng xem: ' bash- 3.00 # gdb GNU gdb 6.8 Bản quyền (C) 2008 Free Software Foundation, Inc. Giấy phép GPLv3 +: GNU GPL phiên bản 3 hoặc mới hơn Đây là phần mềm miễn phí: bạn được tự do thay đổi và phân phối lại nó. KHÔNG CÓ BẢO HÀNH, trong phạm vi pháp luật cho phép. Nhập "hiển thị sao chép" và "hiển thị bảo hành" để biết chi tiết. GDB này được định cấu hình là "i386-pc-solaris2.10". (gdb) đính kèm 4305 Gắn để xử lý 4305 Thử lại # 1: Thử lại # 2: ' – Jas

+0

 Retry #3: Retry #4: [New LWP 1] 0xfef298b5 in ??() (gdb) info frame Stack level 0, frame at 0x80477c8: eip = 0xfef298b5; saved eip 0xfef1b5d2 Arglist at 0x80477c0, args: Locals at 0x80477c0, Previous frame's sp is 0x80477c8 Saved registers: eip at 0x80477c4 (gdb) print The history is empty. (gdb) continue Continuing. ^D ^C quit ^C^C^C ^C 
Jas

+0

làm thế nào tôi có thể định dạng này plz? tôi đã có điều này trong các dòng riêng biệt làm thế nào để tôi có nó cũng trong ý kiến ​​những gì tôi dán trong dòng riêng biệt xin vui lòng? – Jas

4

Đây là một số GDB tutorial ngắn và đây là full GDB manual.

Điểm gỡ lỗi là kiểm tra các phần thú vị/đáng ngờ của chương trình. Breakpoints cho phép bạn dừng thực hiện tại một số vị trí nguồn và watchpoints cho phép bạn dừng khi thay đổi dữ liệu thú vị.

ví dụ đơn giản:

(gdb) break my_function 
(gdb) cont 

này sẽ chèn một breakpoint vào đầu my_function, vì vậy khi thực hiện chương trình vào các chức năng của chương trình sẽ bị treo và bạn sẽ có được GDB nhắc lại, và có thể inspect program's state. Hoặc bạn có thể step thông qua mã.

(gdb) watch my_var 
(gdb) cont 

Tương tự, nhưng bây giờ chương trình sẽ bị dừng tại bất kỳ vị trí nào sửa đổi giá trị my_var.

Phích cắm không biết - đây là liên kết đến số GDB presentation tại số NYC BSD User Group. Hi vọng điêu nay co ich.

+0

nhưng tôi chỉ muốn chọn một điểm trong thời gian của riêng tôi và tại thời điểm đó để kiểm tra dấu vết ngăn xếp ... và sau đó để tiếp tục chương trình, tôi không muốn breakpoints ... trong trường hợp của tôi tôi muốn kiểm tra stack theo dõi của chương trình tại một thời điểm của riêng tôi. – Jas

+0

OK, 'tín hiệu thông tin' nói gì về' SIGINT'? –

+0

@Những gì có thể sử dụng là nó ngẫu nhiên làm gián đoạn một chương trình đang chạy để kiểm tra dấu vết ngăn xếp? Tất cả những gì bạn sẽ tìm thấy là mã hiện đang nằm trên ngăn xếp là mã đang chạy. Thông thường đây là một vòng lặp chờ đầu vào của người dùng. Ho hum. – theMayer

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