我创建了一个程序,它定期从网站下载一个文本文件,格式为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