2009-08-26 32 views
7

Tôi đang cố gắng hiểu cách một thư viện hoạt động. Tôi đã biên soạn nó với các bản nháp được thêm vào của tôi và mọi thứ đều tuyệt vời. Bây giờ tôi muốn dừng chương trình ví dụ trong suốt thời gian chạy để nhìn vào ngăn xếp cuộc gọi, nhưng tôi không thể tìm ra cách thực hiện nó với gdb. Hàm tôi muốn chia nhỏ, nằm trong thư viện được chia sẻ. Tôi đã xem xét một previous question ở đây trên SO, nhưng cách tiếp cận này không hiệu quả đối với tôi. Ngôn ngữ được đề cập là C++. Tôi đã cố gắng cung cấp tên tệp và số dòng, nhưng gdb từ chối hiểu rằng, nó chỉ liệt kê các tệp nguồn từ ứng dụng demo.Gỡ lỗi/truy tìm bên trong thư viện được chia sẻ trong thời gian chạy?

Mọi đề xuất?

Trả lời

4

Bạn có thể thực hiện "ngắt chính" trước. Khi bạn nhấn vào đó, thư viện chia sẻ sẽ được tải, và sau đó bạn có thể thiết lập một điểm ngắt trong bất kỳ thói quen nào của nó.

+1

Có, nhưng hãy chắc chắn bạn đã biên soạn thư viện với -g, và với tối ưu hóa tắt! – Alex

+0

Thật không may là không giúp được gì. Chức năng vẫn không hiển thị, ngay cả từ chính. Có bất cứ điều gì tôi có thể thêm vào mã, để thực hiện việc dừng lại và thả vào trình gỡ lỗi? – EightyEight

+0

@EightyEight: Hmm, có hiệu quả với tôi. Là thư viện bạn đang cố gắng để gỡ lỗi có lẽ tự động nạp thông qua dlopen()? Điều đó có thể giải thích tại sao nó vẫn không hiển thị trong chính. Nếu đúng như vậy, bạn có thể đặt điểm ngắt đầu tiên của mình sau cuộc gọi dlopen cho thư viện đích, sau đó đặt điểm ngắt cuối cùng. Có vẻ như có một cách đơn giản hơn; Tôi sẽ tiếp tục tìm kiếm. –

3

Có hai trường hợp để xem xét (và câu hỏi của bạn không làm cho nó rõ ràng trường hợp này bạn có):
- thực thi của bạn được liên kết với các thư viện chia sẻ trực tiếp:
điều này có nghĩa rằng GDB sẽ "nhìn thấy" ký hiệu (và các nguồn) từ thư viện chia sẻ khi bạn dừng lại trên chính
- thực thi của bạn tự động tải các thư viện chia sẻ (ví dụ như thông qua dlopen):
trong trường hợp đó, GDB sẽ không "nhìn thấy" thư viện chia sẻ của bạn cho đến khi sau khi dlopen hoàn tất.

Vì bạn không thể nhìn thấy biểu tượng khi bạn dừng ở chính, tôi đoán bạn có trường hợp thứ hai. Bạn có thể làm "set stop-on-solib-events 1" tại lời nhắc (gdb)GDB sẽ dừng mỗi khi một thư viện được chia sẻ mới được tải (hoặc không tải).

Bạn có thể xem thư viện nào GDB "biết" về thông qua lệnh info shared.
Chỉ cần đợi cho đến khi bạn thấy thư viện đích của mình trong danh sách đó, trước khi thử đặt các điểm ngắt trong đó.

+0

Giải pháp này sẽ không hoạt động khi gỡ lỗi ứng dụng khách SQLPlus của Oracle –

1

Kiểm tra này ra:

http://linux.die.net/man/1/ltrace

nó sẽ dõi các cuộc gọi thư viện của bạn - có lẽ có ích.

Và "strace" thực hiện tương tự cho các cuộc gọi hệ thống.

Và với điều đó bạn sẽ có thể tìm thấy điểm vào ... Bạn có thể đặt điểm ngắt trong GDB theo cách đó (mặc dù tôi không thể giải thích chi tiết về bản thân mình)

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