Я замечаю странную проблему, когда пытаюсь использовать обработчик сигналов для выгрузки глобальных данных в текстовый файл и генерации файла ядра. Я ожидаю, что данные, выгруженные в файл, будут такими же, как и в основном файле (это те же глобальные данные)
в заголовочном файле foo.h
extern char buffer[100][80] ; // Hundred records each of length 80 characters
в foo.c
char buffer[100][80];
.. in a loop ..
snprintf(buffer[i],80,"%s:%d recorded idx = %d\n",__FUNCTION__,__LINE__,i);
в signal_handler.c
.. in a loop ..
fprintf(..dump data to text file..)
Данные сбрасываются в текстовый файл в порядке. Я запускаю программу в gdb и выдаю сигнал ABRT (сигнал, которым я обрабатываю) через kill. В GDB я вижу
gdb) p &buffer[0]
$3 = (char (*)[80]) 0x1002c8970
Я продолжаю и генерирую файл ядра. В дампе ядра вижу
(gdb) p &buffer[0]
$2 = (char (*)[80]) 0x1002c9a80
разница между двумя позициями составляет 1110.
Мой вопрос: почему я вижу это несоответствие в основном файле? Любые выводы будут оценены!
Спасибо
Джон
РЕДАКТИРОВАТЬ Чтобы уточнить, проблема не в генерации ядра через GDB
Полный код без обработчиков сигналов, чтобы изолировать проблему.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100
char buffer[100][80];
int main()
{
int i = 0;
int idx = 0;
FILE *fp = NULL;
fp = fopen("test.txt","w");
if (!fp)
exit(1);
for (i=0; i < 5500; i++) {
snprintf(buffer[idx],80,"%s:%d idx = %d\n",__FUNCTION__, __LINE__, i);
idx = ((idx + 1)% MAX);
}
for (i = 0 ; i < MAX; i++)
fprintf(fp,"%s",buffer[i]);
fclose(fp);
abort();
return 0;
}
Проблема не в том, что я пытаюсь запустить в GDB, проблема в том, что в основном файле сгенерировано,
gdb) p буфер [0]
$ 2 "c0 - idx = 54 \ n", '\ 0', "main: 20 0x7ef9524"
буфер смещен на 1110 байт. Я использовал GDB, чтобы проверить, не поврежден ли буфер. Извините за путаницу.