我創建了一個程序,它定期從網站下載一個文本文件,格式爲csv,並對其進行解析,然後提取相關數據,然後顯示。防止字符串操作崩潰導致整個應用崩潰
我注意到,偶爾每隔幾個月左右就會崩潰。考慮到數據下載和解析的週期可能每5分鐘甚至更少發生,崩潰很少見。我很確定它在解析字符串並提取數據的函數內崩潰。當它崩潰時,會發生擁塞的互聯網連接,即大量下載和/或連接速度較慢。有時遠程站點可能正在處理損壞或不完整的數據。
我使用了一個測試應用程序,它在處理之前保存要處理的數據,並且確實發現崩潰發生時它並未完成。
我調整了函數來適應一些無效或不完整數據的情況,以及檢查所有返回值。我還檢查用於連接遠程站點並下載數據的各種函數的返回值。如果返回值表示沒有成功,則不會再繼續。
功能的核心使用strsep()通過數據走路,提取出來的信息:
/ *
* delimiters typically contains: <;>, <">, < >
* strsep() is used to split part of the string using delimiter
* and copy into token which then is copied into the array
* normally the function stops way before ARRAYSIZE which is just a safeguard
* it would normally stop when the end of file is reached, i.e. \0
*/
for(n=0;n<ARRAYSIZE;n++)
{
token=strsep(©_of_downloaded_data, delimiters);
if (token==NULL)
break;
data->array[n].example=strndup(token, strlen(token));
if (data->array[n].example!=NULL)
{
token=strsep(©_of_downloaded_data, delimiters);
if (token==NULL)
break;
(..)
copy_of_downloaded_data=strchr(copy_of_downloaded_data,'\n'); /* find newline */
if (copy_of_downloaded_data==NULL)
break;
copy_of_downloaded_data=copy_of_downloaded_data+1;
if (copy_of_downloaded_data=='\0') /* find end of text */
break;
}
因爲我懷疑我能不能解釋其中的數據可以被破壞我想所有的方法想知道是否有一種方法來編程,以便在運行時的函數在數據損壞的情況下不會使整個應用程序崩潰。
如果這是不可能的,我可以做些什麼來使它更健壯。
編輯:當數據突然結束,其中一個場的中間被切割的,碰撞的一個可能的實例是即
「測試」,「示例」,「這個數據是布洛克
至少我注意到它通過保存的數據看,但我發現它不是一致的。會不會有壓力測試它是以下建議。
如果有人可以控制孩子的過程,他們現在也可以控制過程 – 2015-04-03 22:19:30
這是一個非常好的點科爾! – 2015-04-03 22:51:02
非常好的建議,謝謝。我一直在考慮餵它測試數據。在開發的早期階段,我確實使用了valgrind,並且修復了所有可以解決的問題。這個錯誤每隔幾個月就會觸發一次,雖然有時候會在一天內出現幾次,然後在幾周內沒有出現,這使得它在調試器和類似工具中運行變得不太實際。 – aseq 2015-04-03 23:24:28