2008-09-23 27 views
13

Điều đó có nghĩa là gì khi nó cung cấp cho một backtrace với đầu ra sau đây?Thông báo phản hồi GDB "0x0000000000000000 in ??()" có nghĩa là gì?

#0 0x00000008009c991c in pthread_testcancel() from /lib/libpthread.so.2 
#1 0x00000008009b8120 in sigaction() from /lib/libpthread.so.2 
#2 0x00000008009c211a in pthread_mutexattr_init() from /lib/libpthread.so.2 
#3 0x0000000000000000 in ??() 

Chương trình đã bị lỗi với tín hiệu chuẩn 11, lỗi phân đoạn. Ứng dụng của tôi là chương trình FastCGI C++ đa luồng chạy trên FreeBSD 6.3, sử dụng pthread làm thư viện luồng.

Nó đã được biên dịch bằng -g và tất cả các bảng biểu tượng cho nguồn của tôi được tải, theo các nguồn thông tin.

Như đã nói rõ, không có mã thực sự nào của tôi xuất hiện trong dấu vết mà thay vào đó, lỗi có vẻ như bắt nguồn từ các thư viện pthread chuẩn. Đặc biệt, cái gì ??() ????

EDIT: cuối cùng đã theo dõi sự cố xuống quyền truy cập bộ nhớ không hợp lệ tiêu chuẩn trong mã chính của tôi. Không giải thích tại sao dấu vết ngăn xếp bị hỏng, nhưng đó là câu hỏi cho một ngày khác :)

Trả lời

9

gdb không thể trích xuất địa chỉ trả về thích hợp từ pthread_mutexattr_init; nó có địa chỉ là 0. "??" là kết quả của việc tìm kiếm địa chỉ 0 trong bảng biểu tượng. Nó không thể tìm thấy một tên biểu tượng, vì vậy nó in một mặc định "??"

Thật không may, tôi không biết tại sao nó không thể trích xuất địa chỉ trả lại chính xác.

3

Đảm bảo bạn biên dịch bằng biểu tượng gỡ lỗi. (Đối với gcc tôi nghĩ đó là tùy chọn -g). Sau đó, bạn sẽ có thể nhận được thông tin thú vị hơn từ GDB. Đừng quên tắt nó khi bạn biên dịch phiên bản sản xuất.

0

Có thể lỗi gây ra sự cố đã làm hỏng ngăn xếp (các phần ghi đè của ngăn xếp)? Trong trường hợp đó, backtrace có thể là vô dụng; không biết phải làm gì trong trường hợp đó ...

5

Điều gì đó bạn đã làm cho thư viện luồng bị lỗi. Kể từ khi thư viện luồng chính nó không được biên dịch với các biểu tượng gỡ lỗi (-g), nó không thể hiển thị các tập tin mã nguồn hoặc số dòng vụ tai nạn xảy ra trên. Ngoài ra, vì nó là chủ đề, ngăn xếp cuộc gọi không trỏ trở lại tệp của bạn. Thật không may đây sẽ là một lỗi khó khăn để theo dõi, bạn sẽ cần phải bước qua mã của bạn và thử và thu hẹp khi chính xác vụ tai nạn xảy ra.

2

Tôi có thể thiếu một cái gì đó, nhưng không phải là dấu hiệu của một người sử dụng NULL làm con trỏ hàm?

#include <stdio.h> 

typedef int (*funcptr)(void); 

int 
func_caller(funcptr f) 
{ 
    return (*f)(); 
} 

int 
main() 
{ 
    return func_caller(NULL); 
} 

này tạo ra phong cách tương tự của một vết lùi nếu bạn chạy nó trong gdb:

rivendell$ gcc -g -O0 foo.c -o foo 
rivendell$ gdb --quiet foo 
Reading symbols for shared libraries .. done 
(gdb) r 
Starting program: ... 
Reading symbols for shared libraries . done 

Program received signal EXC_BAD_ACCESS, Could not access memory. 
Reason: KERN_PROTECTION_FAILURE at address: 0x00000000 
0x00000000 in ??() 
(gdb) bt 
#0 0x00000000 in ??() 
#1 0x00001f9d in func_caller (f=0) at foo.c:8 
#2 0x00001fb1 in main() at foo.c:14 

Đây là một vụ tai nạn khá kỳ lạ mặc dù ... pthread_mutexattr_init hiếm khi làm bất cứ điều gì hơn phân bổ một cấu trúc dữ liệu và memset. Tôi sẽ tìm cái gì khác đang diễn ra. Có khả năng các thư viện luồng không phù hợp hay gì đó không. Kiến thức BSD của tôi là một ít ngày, nhưng đã từng là vấn đề xung quanh vấn đề này.

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