Đây là mã:
void i_log_ (lỗi int, tệp const char *, dòng int, const char * fmt, ...)
{
/* Lấy mô tả lỗi */
char * str_err = get_str_error (errno);
xóa_trailing_newl (str_err);
/*Định dạng chuỗi và tham số */
tin nhắn char [1024];
va_list ap;
va_start (ap, fmt);
vsprintf (tin nhắn, fmt, ap);
va_end (ap);
/* Lấy thời gian */
time_t t = thời gian (NULL);
thời gian char[64];
char * temp = ctime (&t);
strncpy (stime, temp, sizeof stime - 1);
Remove_trailing_newl (thời gian);
TẬP TIN * nhật ký;
#ifdef __WIN32__
#else
# ifdef P_LISTENER
log = fopen(I_LOG_FILE, "a+b");
đàn (fileno (log), LOCK_EX);
# else /* mô tả tập tin chia sẻ của nhật ký, khóa trước khi mở */
pthread_mutex_lock (& mutex);
log = fopen(I_LOG_FILE, "a+b");
# kết thúc
#endif
nếu (nhật ký) {
nếu (lỗi)
fprintf (log, ERR_FORMAT, stime, tệp, dòng, str_err, tin nhắn);
khác
fprintf (log, ERR_FORMAT_NO_ERRNO, stime, file, dòng, tin nhắn);
}
#ifdef __WIN32__
miễn phí (str_err);
#else
# ifdef P_LISTENER
đàn (fileno (log), LOCK_UN);
fclose(log);
#khác
fclose(log);
pthread_mutex_unlock (& mutex);
# kết thúc
#endif
return;
}
Mặc dù có cơ chế khóa nhưng các chức năng không được gọi đồng thời trong trường hợp này, vì vậy tôi không nghĩ đó là vấn đề. Tuy nhiên, chương trình nhận được một SIGABRT
:
[…]
(gdb)c
Tiếp tục.
Chương trình đã nhận được tín hiệu SIGHUP, gác máy // Không sao, tôi đã gửi cái này.
0x00dee416 trong __kernel_vsyscall ()
(gdb)c
Tiếp tục.
Chương trình nhận được tín hiệu SIGABRT, Đã hủy bỏ.
0x00dee416 trong __kernel_vsyscall ()
(gdb)lên
#1 0x0013ae71 trong raise () từ /lib/i386-linux-gnu/libc.so.6
(gdb)lên
#2 0x0013e34e khi hủy bỏ () từ /lib/i386-linux-gnu/libc.so.6
(gdb)lên
#3 0x00171577 trong ?? () từ /lib/i386-linux-gnu/libc.so.6
(gdb)lên
#4 0x0017b961 trong ?? () từ /lib/i386-linux-gnu/libc.so.6
(gdb)lên
#5 0x0017d28b trong ?? () từ /lib/i386-linux-gnu/libc.so.6
(gdb)lên
#6 0x0018041d miễn phí () từ /lib/i386-linux-gnu/libc.so.6
(gdb)lên
#7 0x0019b0d2 trong ?? () từ /lib/i386-linux-gnu/libc.so.6
(gdb)lên
#8 0x0019b3c5 trong ?? () từ /lib/i386-linux-gnu/libc.so.6
(gdb)lên
#9 0x00199a9f theo giờ địa phương () từ /lib/i386-linux-gnu/libc.so.6
(gdb)lên
#10 0x00199951 trong ctime () từ /lib/i386-linux-gnu/libc.so.6
(gdb)lên
#11 0x08049634 trong i_log_ (error=0, file=0x804b17d "src/group.c", line=53, fmt=0x804b128 "Thiết lập cấu hình mới: loại trình nghe: %s, số: %d, http-log: % s, cổng: %d.") tại src/error.c:42
42 ký tự * temp = ctime (&t);
(gdb) nhiệt độ in
$1 = 0x260000 ""
(gdb) in t
$2 = 1329935482
(gdb) in &t
$3 = (time_t *) 0xbff8a5b8
(gdb)
Tôi không có manh mối nào cả. thời gian
Trả về một chuỗi trống, trang man không đề cập đến trường hợp này. Bây giờ nghĩ lại, tôi không hiểu tại sao nó lại trả về một chuỗi trống và đoạn mã này có vấn đề gì.
Cảm ơn vì sự giúp đỡ.
thời gian
Chuỗi trống không được trả lại. Nó hoàn toàn không quay trở lại vì nó bị rơi trong khi cố gắng làm việc của mình.
Vụ tai nạn xảy ra lúc miễn phí()
nội bộ, vì vậy bạn có thể đang gọi ctime()
Bộ nhớ đã bị hỏng ở một thời điểm nào đó trước đó. Nếu bạn đang chạy trên nền tảng được hỗ trợ, hãy thử sử dụng công cụ như Valgrind để kiểm tra quyền truy cập bộ nhớ của bạn.
Tôi là một lập trình viên xuất sắc, rất giỏi!