0

我一直在追踪一个我已经缩小到这个骨架的问题:

#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 定义,一切正常,但这当然不是我想要的。)

4

1 回答 1

-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;
}
于 2012-07-11T15:10:40.270 回答