我一直在追踪一个我已经缩小到这个骨架的问题:
#include <unistd.h>
#include <stddef.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct __log_file_details {
FILE *fp ;
char *name ;
} log_file_details_t;
typedef struct __log_files {
char is_open;
log_file_details_t lf[3];
void (*open_log)(struct __log_files *ctl);
void (*close_log)(struct __log_files *ctl);
} log_files_t ;
int write_log(const int file_nbr, log_files_t *ctl, char *log_this, ...);
void close_log(log_files_t *ctl);
void open_log(log_files_t *ctl);
// Here we go...
int main(int argc, char *argv[]) {
log_files_t log_ctl = {
0,
{ {NULL, NULL}, {NULL, NULL}, {NULL, NULL} },
&open_log,
&close_log
};
write_log(0, &log_ctl, "foo"); // That's it.
return 0;
}
void open_log(log_files_t *ctl) {}
void close_log(log_files_t *ctl) {}
int write_log(const int file_nbr, log_files_t *ctl, char *log_this, ...)
{
int rc;
/* ... */
rc = 0;
}
当我使用gdb -g -o foo foo.c
编译此代码时,它适用于我的大多数Linux系统。
但是,我有一个ARM设备(实际上是一个运行Linux的Netgear Stora),它在这个设备上失败了。
在该设备上,如果我使用GDB来执行此代码,那么write_log
执行时(第58行),我看到:
Breakpoint 1, write(log(file_nbr=-1092220616, ctl=0x0, log_this=0xbee60ac4 "-garbage-") at foo.c:58
(其中-1092220616
是一个变化的值,-garbage-
往往包含一堆控制字符。)
我不知道如何确定这是否是运行时问题(其中一个库?),标准标题之一,gcc问题或其他问题。我可以做些什么来识别和解决这个问题?
如果我删除了write_log的va_list定义,一切都运行良好,但当然这不是我想要的。)
答案 0 :(得分:-2)
您需要正确清理函数中的变量args:
int write_log(const int file_nbr, log_files_t *ctl, char *log_this, ...)
{
int rc;
va_list vl;
va_start(vl,log_this);
/* ... */
va_end(vl);
rc = 0;
}