cuốn sách gpt4 ai đã làm

ctime() gây ra SIGABRT(?!)

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-04 01:12:25 26 4
mua khóa gpt4 Nike

Đâ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 đỡ.

câu trả lời hay nhất

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.

Về ctime() gây ra SIGABRT(?!), chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/9401179/

26 4 0
không gian vũ trụ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress