2012-01-09 32 views
16

Tôi biết về this question, nhưng có vẻ như nó không hoạt động đối với tôi.Làm thế nào để liên kết với các phiên bản gỡ lỗi của libc và libstdC++ trong GCC?

Đối với việc thiết lập, hãy C đơn giản chương trình ++, hw.cpp, được cho bởi: int main() { }

Khi biên soạn với g++ -o hw hw.cpp -O0 -g trên Linux, chạy ldd ./hw cho:

linux-gate.so.1 => (0x003e5000) 
    libstdc++.so.6 => /usr/local/lib/libstdc++.so.6 (0x007c5000) 
    libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0x006a4000) 
    libgcc_s.so.1 => /usr/local/lib/libgcc_s.so.1 (0x00a40000) 
    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00a93000) 
    /lib/ld-linux.so.2 (0x00a0f000) 

Bây giờ tôi cũng xuất hiện để có các thư viện debug trong /usr/lib/debug/lib/tls/i686/cmov/, mà tôi tưởng tượng là các bản dựng gỡ lỗi tương ứng của các thư viện hệ thống.

Câu hỏi: Làm thế nào để biên dịch chương trình của tôi để nó được liên kết chống lại debug xây dựng của C và/hoặc C++ thư viện chuẩn, libc/libm/libstdc++, chia sẻ hoặc tĩnh? Đối với việc xây dựng được chia sẻ, tôi muốn đầu ra của ldd ./hw để trỏ đến thư mục gỡ lỗi.

(Bối cảnh: Một trong các thư viện chia sẻ được sử dụng bởi dự án của tôi được báo cáo là bị rò rỉ ("vẫn có thể truy cập") bởi Valgrind, nhưng nguồn gốc không nằm trong thư viện chia sẻ bản thân, nhưng trong dlopen loại mã (see here ..) Vì vậy, tôi figured rằng nếu tôi có thể bước qua _Start() gọi trong CRT tôi có thể có thể theo dõi các thủ phạm)

cập nhật/Correction: tôi nghĩ tôi chỉ là rất, rất ngu ngốc - debug thư viện có lẽ luôn luôn được liên kết như mong muốn tất cả cùng. Tôi đã nhầm lẫn bởi trình gỡ lỗi không hiển thị bất cứ điều gì trong khi bước, đó là bởi vì tôi không có mã nguồn cho các thư viện.

Cập nhật II: OK, hãy cập nhật trước đó. Tôi có nguồn thư viện ngay bây giờ, nhưng trong khi đúng là thư viện chuẩn gửi kèm gỡ lỗi biểu tượng, tôi dường như không có một lỗi riêng biệt xây dựng. Có phải một bản dựng sẵn có không và tôi sẽ liên kết với nó như thế nào?

+1

Bạn có thể biết rằng một số triển khai thư viện chuẩn sử dụng các hồ bơi để phân bổ nhanh? http://valgrind.org/docs/manual/faq.html#faq.undeferrors –

+0

@honk: Tôi hoàn toàn vui khi chấp nhận rằng đây không phải là lo lắng thực sự. Nó chỉ làm phiền tôi là mã của bên thứ ba có thể gây ra các cảnh báo trong mã * my * (lưu ý cách chỉ có các tham chiếu đến một số giả mạo '.c' tập tin mà tôi không thực sự có, * không * để một thư viện được chia sẻ) mà tôi dường như không thể ngăn chặn ... Ít nhất với một CRT gỡ lỗi tôi hy vọng sẽ có được một cái nhìn tốt hơn. –

Trả lời

9

Trên nhiều cài đặt Linux, thư viện gỡ lỗi không chứa mã thực; chúng chỉ chứa thông tin gỡ lỗi. Cả hai được tách ra để bạn có thể chọn không cài đặt chúng nếu bạn không cần chúng và bạn thiếu dung lượng đĩa, nhưng các thư viện gỡ lỗi không tốt cho riêng chúng.

GDB thường được định cấu hình sẵn để tìm các thư viện gỡ lỗi khi bạn cần chúng.

Tất nhiên, hệ thống của bạn có thể khác. Bạn không nói nó là gì.

+0

Bạn nói đúng - tôi đã thực sự liên kết với các thư viện gỡ lỗi tất cả cùng. Tôi đã bị ném đi bởi điều ngu xuẩn nhất, cụ thể là tôi không có mã nguồn * thư viện chuẩn - vì vậy trình gỡ rối đang bước qua, nhưng không thể hiển thị bất cứ điều gì! –

+0

Trên thực tế, điều đó không giúp ích gì cho tất cả - tôi không chỉ muốn các biểu tượng gỡ lỗi, mà là một debug * xây dựng * thực tế của thư viện. Điều này có sẵn trên Debian/Ubuntu không? –

+0

Không thường xuyên. Bạn hoàn toàn đúng rằng các thư viện được tối ưu hóa bình thường là một vấn đề nếu bạn muốn bước qua mã thư viện. Tất nhiên, nếu nó chỉ là một thư viện cụ thể mà bạn muốn, thì bạn luôn có thể tự xây dựng lại nó. 'sudo apt-get build-dep package-name' sẽ cài đặt bất cứ thứ gì bạn cần làm, và bản thân các gói nguồn có thể được tải xuống với' apt-get source package-name'. – ams

0

Chương trình của bạn được liên kết với các thư mục gỡ lỗi.

Chỉ có 'ldd ./hw' mới tìm thấy libstdC++ ở vị trí chuẩn. Để làm điều đó, bạn cần thay đổi LD_LIBRARY_PATH để lấy các thư viện được chia sẻ gỡ lỗi để tải và ldd để tìm chúng đúng cách.

+0

Điều đó cũng không hiệu quả đối với tôi. Tôi đã thử một số biến thể của thiết lập biến đó, nhưng 'ldd' không thay đổi. Tôi biết rằng thiết lập 'LD_LIBRARY_PATH' không hoạt động theo cách đó, vì nó hoạt động tốt với các thư viện khác (không phải hệ thống) ... hoặc bạn đang nói rằng' ldd' sẽ * không bao giờ * báo cáo thư viện gỡ lỗi? –

+0

@KerrekSB: Bạn đã thử (giả sử bash): 'LD_LIBRARY_PATH =/usr/lib/debug/lib/tls/i686/cmov/ldd./Hw' –

+0

@LokiAstari: Vâng, đã cố gắng quá ... để không có kết quả . –

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