2009-07-24 135 views
0

轉換期間的分段錯誤我寫了一個小的Pro * C/C++應用程序[多線程,守護進程]其中,我用Pro * c獲取一些數據庫記錄,然後調用C++函數生成XML文件,通過套接字發送給第三方。從C++轉換到Pro * C

問題是,當調用C++函數時,它正確地生成xml文件,但最終出現Sig 11錯誤,從C++轉換回到Pro * C。在這裏,我沒有任何返回參數,以及C++函數的所有參數都是常量參數。

問題隨機出現。在生成幾個xml之後[從相同的代碼生成]。錯誤不是恆定的。 在生成1或2個xml文件後,第一次運行時,在第二次運行時有5 xmls,有時在1 xml之後生成。

因此,不確定是否與任何代碼問題有關,因爲它正確地生成xml文件,而是堆棧展開/堆棧損壞問題。

在這方面的任何一點,將是很大的幫助。

另外,iam使用aC++編譯器在HP Itanium上工作。

下面是函數的聲明以及它是如何被稱爲:

/* ------------ Pro *C : ------ */ 
GenerateXML(Mic_Prov_Queue_List, Prov_Service_Params_Info, iThreadId); 
/* Declaration : ----------- */ 
#ifdef __cplusplus extern "C" { 
void GenerateXML(const Mic_Prov_List *Mic_Prov_Queue_List, const Mic_Prov_Service_Params_info_x_t * Prov_Service_Params_Info, int iThreadId); 
#ifdef __cplusplus 

問候 Roopesh Majeti的。

+0

我們需要看到一些代碼 - 至少是C++函數的聲明以及如何調用它。 – 2009-07-24 09:29:27

+0

這裏是: ------------ Pro * C: ------ GenerateXML(Mic_Prov_Queue_List,Prov_Service_Params_Info,iThreadId); 宣言: ----------- 的#ifdef __cplusplus 的extern 「C」 { 空隙GenerateXML(常量Mic_Prov_List * Mic_Prov_Queue_List,常量Mic_Prov_Service_Params_info_x_t * Prov_Service_Params_Info, INT iThreadId); #ifdef __cplusplus } – 2009-07-24 09:36:31

+0

請在您的問題中編輯代碼,並對其進行適當格式化。 – 2009-07-24 09:49:33

回答

1

很可能您的GenerateXML函數正在寫入超出緩衝區的邊界並破壞堆棧 - 特別是返回地址。在這種情況下,XML輸出看起來不錯,但一旦返回就會崩潰。

我敢打賭,在GenerateXML中聲明的前幾個變量是某種緩衝區或數組?

編輯

(該OP在評論中表示,的確有大小1000的字符緩衝區中GenerateXML申報)

是的,如果你寫了超過1000個字節到該緩衝區(也就是說,寫入位置緩衝區[1000]或更高),那麼你會損壞的東西 - 在你的情況下,你似乎正在破壞函數的返回值。

要找出其中你的代碼是這樣做的是難點。你有幾個選擇:

  • 手動檢查代碼並嘗試找到它發生的位置;
  • scatter assert(n < 1000)在每次訪問buffer [n]之前的語句並使用調試器來確定發生了什麼;
  • 在調試器下運行它,在緩衝區[999]上設置一個觀察點,然後在觀察點觸發後單步查看訪問緩衝區[1000]的時間;
  • 在像valgrind或Purify這樣的代碼分析工具下運行它。
+0

這是真的,我有一個char緩衝區聲明和使用它。但它只有1000字節的大小。但我敢打賭,它不應該創建崩潰/覆蓋堆棧返回地址。可以 ?如果是這樣,我們如何確保,不發生這樣的事情。 – 2009-07-24 19:49:18

+0

如果你寫了超過1000個字節,它肯定會。您應該仔細檢查代碼,以查看缺少邊界檢查的位置,讓同事檢查代碼,以及如果其他所有程序都無法在諸如valgrind或Purify的分析工具下運行程序。 – caf 2009-07-25 00:49:54

+0

只是一個問題。是否有任何限制參數[或緩衝區,而不是]功能將有。根據你的陳述,你說,「如果你寫了超過1000字節,它肯定會。」你能解釋一下我,多一點點或者指向任何有相同信息的網站鏈接。提前致謝。 Registers Roopesh M. – 2009-07-25 17:31:38