2012-04-10 24 views
5

Tôi đang sử dụng backtrace() và backtrace_symbols() để lùi đầu ra trên SIGSEGV và các tín hiệu khác ở định dạng như thế này:Làm thế nào để giải thích địa chỉ backtrace để gỡ lỗi với GDB

0: [0xb750818] 
1: /opt/server/libQtScript.so.4(+0x6f42a) [0xb782c42a] 
2: /opt/server/libQtScript.so.4(+0x7bffc) [0xb7838ffc] 
3: /opt/server/libQtScript.so.4(+0x86946) [0xb7843946] 
4: /opt/server/libQtScript.so.4(+0x7c4bc) [0xb78394bc] 
5: /opt/server/libQtScript.so.4(+0x86946) [0xb7843946] 
6: /opt/server/libQtScript.so.4(+0x9603e) [0xb785303e] 
7: /opt/server/libQtScript.so.4(_ZN12QScriptValue4callERKS_RK5QListIS_E+0x2e7) [0xb7891647] 

Trong trường hợp đặc biệt này, khung # 7 là tốt cho tôi, mặc dù khung 1-6 mang lại cho tôi một số loại "+ x" địa chỉ.

Cách lấy đường chính xác để tháo rời cho "+ 0x6f42a" và các địa chỉ khác trong GDB? Và khung # 0, không có mô-đun được mô tả, có nghĩa là gì?

Trả lời

8

Làm thế nào để có đường chính xác để tháo rời cho "+ 0x6f42a" và các địa chỉ khác trong GDB?

gdb /opt/server/libQtScript.so.4 
(gdb) x/10i 0x6f42a 

Thông thường, bạn sẽ muốn hướng dẫn thực hiện trước 0x6f42a, vì vậy bạn sẽ làm điều này:

(gdb) x/20i 0x6f42a-30 

Bỏ qua vài hướng dẫn đầu tiên: bạn có thể bắt đầu tháo dỡ từ giữa một của một. Thông thường, việc tháo gỡ sẽ đồng bộ hóa lại sau một vài hướng dẫn và sẽ bắt đầu hiển thị dòng lệnh chính xác sau đó.

Và khung nào # 0, không mô tả mô tả, có nghĩa là gì?

Thư viện của bạn đã bị loại bỏ các ký hiệu, vì vậy, các ký hiệu duy nhất bạn nhìn thấy (ví dụ: _ZN12QScriptValue4callERKS_RK5QListIS_E) là các ký hiệu hiển thị bên ngoài (được xuất).

Có tệp biểu tượng libQtScript.so.4.5.2.debug trong thư mục QT_SOURCE/lib. Vì vậy, có lẽ tôi nên sao chép tập tin .debug gần thực thi để có được backtrace với các biểu tượng đầy đủ?

GDB sẽ tải biểu tượng tự động từ libQtScript.so.4.5.2.debug nếu bạn đặt debug-file-directory thành $QT_SOURCE/lib.

Cập nhật:

tôi ment nhận backtrace với các biểu tượng mà không cần gắn GDB

Tôi không tin có bất kỳ hỗ trợ trong backtace_symbols() cho tải file debuginfo riêng biệt.

+0

thư mục gỡ lỗi-tệp là dành cho GDB, nhưng tôi nhận được backtrace với các biểu tượng mà không cần đính kèm GDB. Làm thế nào để đảm bảo backtrace_symbols() nhận được tất cả dữ liệu ký hiệu? Việc đặt tệp .debug có đủ không? Những tai nạn này rất hiếm, vì vậy tôi không thể tái tạo chúng trong môi trường phát triển mỏ. –

0

Nếu bạn có libQTScript được biên dịch với các ký hiệu gỡ lỗi, bạn sẽ nhận được một backtrace tốt hơn với các tên hàm và các giá trị tham số. Tôi không biết chính xác làm thế nào để trích xuất các thông tin tương tự mà không có các biểu tượng gỡ lỗi (mặc dù nó sẽ là có thể nếu bạn có đúng tập tin bản đồ hoặc tập tin bảng biểu tượng của libQTScript).

Nhưng cách dễ dàng là cài đặt libqt bằng các biểu tượng gỡ lỗi và chạy ngược lại. Nếu cả hai lib bị tước và gỡ lỗi đều được cài đặt và gdb chọn trình rút gọn, hãy thử trỏ gdb tới thư viện gỡ lỗi bằng LD_LIBRARY_PATH = path/to/debug/libs. (xem câu trả lời này cho một phương pháp khác để đặt đường dẫn How do I prepend a directory the library path when loading a core file in gdb on Linux)

+0

Có tệp biểu tượng libQtScript.so.4.5.2.debug trong thư mục QT_SOURCE/lib. Vì vậy, có lẽ tôi nên sao chép tập tin .debug gần thực thi để có được backtrace với các biểu tượng đầy đủ? –

+0

Bạn có thể yêu cầu gdb sử dụng tệp đó làm bảng biểu tượng. Hãy thử lệnh add-symbol-file từ bên trong gdb và xem nó có hoạt động hay không. Sau đó gõ bt một lần nữa cho backtrace. –

+0

Tập tin thêm-biểu tượng muốn một địa chỉ bộ nhớ làm đối số. Tôi nghĩ rằng bạn có thể nhận được địa chỉ bằng cách kiểm tra đầu ra của lệnh: info sharedlibrary (bắt đầu gỡ lỗi, sau đó phát hành lệnh thông tin). –