このスケルトンに絞り込んだ問題を追跡してきました。
#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
( where-1092220616
はさまざまな値であり-garbage-
、一連の制御文字を含む傾向があります。)
これが実行時の問題 (ライブラリの 1 つですか?) なのか、標準ヘッダーの問題なのか、gcc の問題なのか、それとも何か他の問題なのかを判断する方法がわかりません。この問題を特定して解決するにはどうすればよいですか?
write_log の va_list 定義を削除すると、すべてうまく機能しますが、もちろん、それは私が望んでいることではありません。)