2013-06-03 32 views
9

Tôi đang gỡ lỗi tĩnh đa luồng x86-64 C++ ứng dụng trên Linux.gdb bước không hoạt động như mong đợi

Tôi có thể đặt điểm ngắt trên các chức năng và dừng lại trên chúng và tôi có thể đi từng bước trên cơ thể chức năng. Nhưng khi tôi cố gắng bước vào một hàm khác, gdb không dừng lại ở lúc bắt đầu và có vẻ như nó chỉ tiếp tục thực hiện. Khi tôi gián đoạn thực hiện chương trình, gdb đi để phá vỡ trạng thái và trở nên không sử dụng được:

(gdb) bt 
Target is executing. 
(gdb) c 
Continuing. 
Cannot execute this command while the selected thread is running. 
(gdb) 

Là một workaround tôi có thể sử dụng stepi nhiều lần thay vì step, stepi công trình như mong đợi. Điều gì có thể là lý do của hành vi này? Có cách nào khác ngoài việc sử dụng stepi không? Tôi đang sử dụng gdb 7.6 và gcc 4.7.1.

+0

Bạn đã biên dịch mục tiêu bằng '-ggdb' và' -O0' chưa? Bạn đã thử quan sát sự khác biệt giữa bước ('s') và tiếp theo (' n')? – Reinderien

+0

@Reinderien, mục tiêu của tôi được biên dịch với '-g' và' -O0'. Làm thế nào tôi có thể quan sát sự khác biệt giữa 's' và' n'? – ks1322

+0

Thử thay đổi từ '-g' thành' -ggdb'. Để thấy sự khác biệt, hãy bước qua gõ 's' (có hiệu quả là" bước vào ") so với' n' (có hiệu quả "bước qua") trong gdb. – Reinderien

Trả lời

12

Điều gì có thể là lý do của hành vi này?

Đó là lỗi trong GDB. Nó thiết lập một điểm dừng tạm thời và hy vọng nó sẽ bị tấn công. Nhưng điểm ngắt không bị ảnh hưởng (có thể bởi vì nó được đặt ở vị trí sai), và máy trạng thái bên trong của GDB bị lẫn lộn.

Có cách nào khác ngoài việc sử dụng stepi không?

Bạn có thể thử nâng cấp lên phiên bản GDB hàng đầu từ CVS và nếu GDB vẫn bị hỏng, hãy báo cáo lỗi trong GDB bugzilla.

+0

Có ai báo cáo điều này không? Số lỗi là gì? –

+0

@LightnessRacesinOrbit, tôi đã báo cáo nó gần đây, xem bản sao tối thiểu trong báo cáo lỗi https://sourceware.org/bugzilla/show_bug.cgi?id=17134 – ks1322

1

Bước lệnh Cảnh báo:

Nếu bạn sử dụng lệnh bước trong khi điều khiển là trong vòng một chức năng đã được biên dịch mà không cần thông tin gỡ lỗi, tiền thu được thực hiện cho đến khi kiểm soát đạt đến một chức năng mà không có thông tin gỡ lỗi. Tương tự như vậy, nó sẽ không bước vào một hàm được biên dịch mà không có thông tin gỡ lỗi.

Ngoài ra, lệnh bước chỉ nhập một hàm nếu có thông tin số dòng cho hàm. Nếu không nó hoạt động như lệnh tiếp theo.

2

Đó là một bài đăng cũ. Tôi vẫn tin rằng có thể có ai đó được hưởng lợi từ việc này.

Tôi đã gặp vấn đề tương tự. Trong trường hợp của tôi, quá trình này đa luồng. Và tôi tình cờ nhận thấy rằng các chủ đề trong đó nhấn một điểm break đã được ngừng lại và các chủ đề khác đã được thực hiện:

6 Thread 1000368545 (running) 
    5 Thread 1000368389 (running) 
    4 Thread 1000368388 (running) 
    3 Thread 1000368387 (running) 
    2 Thread 1000368386 myBreakPointFunction() at location/in/my/sourcefile.c:linenumber 
* 1 Thread 1000367766 (running) 

khi ban hành 'left' lệnh nó đã hiển thị 'Target đang thực hiện.' Khi tôi chuyển sang chuỗi 2 (bằng cách phát hành 'chuỗi 2') và phát hành bt, tôi có thể thấy dấu vết cuộc gọi của mình. Để biết thêm thông tin hoặc nếu bạn muốn thực hiện một số thử nghiệm, tôi đề nghị "đặt lịch trình khóa" có thể chứng minh là hữu ích. Chi tiết cho chế độ này có sẵn tại: https://sourceware.org/gdb/onlinedocs/gdb/All_002dStop-Mode.html

+0

Tại sao bạn sẽ hiển thị danh sách chuỗi nhưng không hiển thị lệnh? – clearlight

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