2011-09-21 73 views
-1

我一直在試圖理解爲什麼我運行的C語言編寫的languagge程序而得到「段錯誤」。分段故障問題,GDB消息

我試過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

首先,編譯並與'-g'標誌喜歡讓調試符號,並確保崩潰真的用'sprintf'發生。此外,請確保'Cod_Articolo'不是太大以至於它將字符串推過511字節(+ null哨兵)邊界。最後但並非最不重要,'Cod_Articolo'實際上是否指向一個有空的C字符串的有效內存位置? – DarkDust

+0

也有興趣你如何實際調用'mysql_slave_send_query'(或者如果它被另一種方法包裝,你如何調用它)。我的觀點是:是否有可能傳遞了未初始化或錯誤的指針?例如,你通過'query'或'&query'? – DarkDust

+0

你能告訴我們從Cod_Articolo的定義到調用mysql_slave_send_query()的代碼嗎? –

回答

0

「段錯誤」是指你的程序被命名爲mysql_slave_send_query函數的執行期間訪問一個無效的內存位置。因此這意味着你的C程序中有一個錯誤。

2

檢查參數mysql_slave_send_query,特別是長度和其它參數的正確初始化/分配。

+0

在一個nushell和幾乎我應該怎麼做?..謝謝 – Vera

+0

有可能你的查詢大於511個字符?換句話說 - Cod_Articolo有多長時間? – Ofir

+0

我試圖增加的char [512]到char [1024]但是它不work..Cod_Articolo在MySQL被聲明爲char [20] ..如果我能我的代碼發送給別人的東西會更容易 – Vera

0

多大的Cod_Articolo內容?您的查詢將近400個字符,您存儲的緩衝區只有512個字符 - 如果Cod_Articolo超過110個字符,您的代碼將會中斷。

如果是這樣的問題,你可以寫它到查詢字符串之前阻止它通過檢查Cod_Articolo大小。更好的是,您可以計算查詢字符串所需的大小,並準確分配恰當的數量。

最好使用snprintf而不是sprintf,因爲這樣可以確保不會將太多字符複製到目標字符串中。

+0

謝謝..Cod_Articolo是char [20],我也試圖增加char [512]到char [1024],但它不起作用。 – Vera

+0

好的。 Cod_Articolo結尾處是否有空字符「'\ 0''? –

+0

我剛剛添加它在查詢字符串.... nd Art_Acquisto ='%s'\ 0''Data by Data_Acquisto;「,Cod_Articolo); ...但無濟於事。我也試過snprintf,但我得到一些錯誤... – Vera