2009-02-18 4 views
1

У меня возникла странная проблема в куске кода.memset и SIGSEGV

void app_ErrDesc(char *ps_logbuf, char *pc_buf_err_recno) 
{ 
    char *pc_logbuf_in; 
    char rec_num[10]; 
    char *y = "|"; 
    int i, j; 

    memset(rec_num, 0, sizeof(rec_num)); 
    memset(pc_buf_err_recno, 0, LOGBUFF); 
     ..... 
     ..... 
} 

По какой-то причине первый вызов memset отправляет SIGSEGV. Что более странно, когда внутри gdb такая же строка выполняется примерно 30 раз, хотя функция называется только один раз, и внутри нет петель! Вот часть сеанса gdb.

7295   /*Point to logbuffer string*/ 
(gdb) 
7292   memset(rec_num, 0, sizeof(rec_num)); 
(gdb) 
7295   /*Point to logbuffer string*/ 
(gdb) 
7292   memset(rec_num, 0, sizeof(rec_num)); 
(gdb) n 
7295   /*Point to logbuffer string*/ 
(gdb) 
7292   memset(rec_num, 0, sizeof(rec_num)); 
(gdb) 

Программный сигнал SIGSEGV, ошибка сегментации.

Я также попытался запустить программу с помощью инструмента memcheck valgrind, но не получил ничего существенного в этом фрагменте кода.

Файл, который я обрабатываю, имеет только одну запись.

Любые указатели оцениваются. Благодарю.

+0

, пожалуйста, предоставьте нам окружающий звонок app_ErrDesc –

ответ

2

Вполне вероятно, что это вторая MemSet и причина заключается в том, что внешняя функция вызывается с недостаточным размером буфера. Отладчики могут некорректно показывать, где вы находитесь. Попытайтесь добавить журнал после каждого шага, чтобы узнать, что именно происходит.

1

я подозреваю, что вызов функции, поэтому убедитесь, что вызов не что-то вроде

char pc_buf_err_recno[SMALLER_THAN_LOGBUFF]; 
char ps_logbuf[TOO_SMALL] 
app_ErrDesc(ps_logbuf, pc_buf_err_recno); 
1

Отладчики могут быть неверными, особенно если вы получаете SEGV. Помните, что вполне возможно, что вы повредили стек, когда получаете ошибку сегментации, и отладчик будет запутан, если это произойдет.

Также вполне возможно, что вызывающая функция создала беспорядок, а не текущий.

1

Что более странно, когда внутри gdb одна и та же линия выполняется примерно 30 раз, хотя функция вызывается только один раз, и внутри нет петель!

Это звучит условно скомпилировано с оптимизацией. Возможно, вам легче определить проблему в GDB, если вы скомпилируете ее с отключенными оптимизациями.