分段故障问题,gdb消息

时间:2011-09-21 06:38:58

标签: mysql c

我一直在努力理解为什么在运行用C语言编写的程序时会出现“SEGMENTATION FAULT”。

我试过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 个答案:

答案 0 :(得分:2)

检查你的mysql_slave_send_query的参数,特别是其他参数的长度和正确的初始化/分配。

答案 1 :(得分:0)

“分段错误”表示您的程序在执行名为mysql_slave_send_query的函数期间访问了无效的内存位置。 因此,这意味着您的C程序中存在错误。

答案 2 :(得分:0)

Cod_Articolo的内容有多大?您的查询将近400个字符,并且您存储的缓冲区只有512个字符 - 如果Cod_Articolo超过110个字符,则代码将中断。

如果这是问题,您可以通过在将Cod_Articolo写入查询字符串之前检查sprintf的大小来阻止它。更好的是,您可以计算查询字符串所需的大小,并分配恰当的数量。

使用snprintf代替{{1}}也是一种好习惯,因为您可以确保不会将太多字符复制到目标字符串中。