Проблема ошибки сегментации, сообщение GDB - PullRequest
0 голосов
/ 21 сентября 2011

Я пытался понять, почему я получаю «SEGMENTATION FAULT» при запуске программы, написанной на языке C.

Я попробовал GDB.

Это сообщение, которое я получил:

Program received signal SIGSEGV, Segmentation fault.
0x0016e5e0 in mysql_slave_send_query () from /usr/lib/libmysqlclient.so.16
(gdb) step
Single stepping until exit from function mysql_slave_send_query, 
which has no line number information.

Program terminated with signal SIGSEGV, Segmentation fault.
The program no longer exists.

Дело в том, что я не получаю сообщения об ошибках / предупреждениях компилятора, но программа не работает должным образом.

Может ли кто-нибудь мне помочь?

Мой запрос:

char query[512];
    sprintf(query, "SELECT t1.Art_Acquisto as 'Cod',t2.Des_Articolo as 'Descrizione',t4.Cod_Categoria as 'Cat.',t1.Data_Acquisto as"                   "'data',t1.Netto_Acquisto as'Importo',t3.Des_Fornitore as 'Fornitore' from "
               "Aquisti as t1, Articoli as t2, Fornitori as t3, Categorie as t4  where t1.Art_Acquisto = t2.Cod_Articolo and "  
                       "t1.fornitoreM = t3.codiceF and t4.codiceC = t2.categoriaA and Art_Acquisto ='%s'order by Data_Acquisto;",Cod_Articolo);

Ответы [ 3 ]

2 голосов
/ 21 сентября 2011

Проверьте ваши аргументы для mysql_slave_send_query, особенно длину и правильную инициализацию / распределение других аргументов.

0 голосов
/ 21 сентября 2011

Насколько велико содержание Cod_Articolo? Ваш запрос содержит около 400 символов, а буфер, в котором вы его храните, - всего 512 символов - если Cod_Articolo превышает 110 символов, ваш код будет поврежден.

Если это проблема, вы можете предотвратить ее, проверив размер Cod_Articolo перед записью в строку запроса. Более того, вы можете рассчитать размер строки запроса и выделить точно правильную сумму.

Хорошей практикой также является использование snprintf вместо sprintf, так как тогда вы можете быть уверены, что не копируете слишком много символов в строку назначения.

0 голосов
/ 21 сентября 2011

«Ошибка сегментации» означает, что ваша программа обращается к неверной ячейке памяти во время выполнения функции с именем mysql_slave_send_query. Следовательно, это означает, что в вашей C-программе есть ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...