memset и SIGSEGV - PullRequest
       60

memset и SIGSEGV

1 голос
/ 18 февраля 2009

Я столкнулся со странной проблемой в куске кода.

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, но не получил ничего значительного в приведенном выше фрагменте кода.

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

Любые указатели приветствуются. Спасибо.

Ответы [ 4 ]

2 голосов
/ 18 февраля 2009

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

1 голос
/ 18 февраля 2009

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

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

1 голос
/ 18 февраля 2009

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

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

1 голос
/ 18 февраля 2009

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

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