记一次错误排查,主要问题是跨平台文件中换行符(CRLF, LF)和垃圾字符( Caret Notation)

笔者测试SPEC14的workload的时候,须要自定义workload,又须要在Windows和Linux平台上都要测试,因此就遇到了这么个问题:测试工具报错,可是报出来的错误信息又跟错误对不上。windows


工具没问题,不跨平台就没问题,因此首先怀疑跨平台的文件是否是有什么不同。工具

使用notepad++打开导出的workload文件,发现Linux平台下和Windows平台下的长的不同。测试

image

image


使用notepad++的状态栏的功能,能够快速转换这两种换行符。spa

image

或者遵循下面的步骤:code

For a single file you can use Notepad++ replace utility:blog

  • Go to Search -> Replace (or ctrl-h)
  • In the dialog box select "Extended" search mode
  • Set "Find What" to: \r\n
  • Set "Replace With" to: \n
  • Click "Replace All"

然而,问题并无解决,仍是报错。ip

再Linux下使用cat查看两个文件,发现有些不同:ci

image

两个文件的大小也不一样。Notepad++里看上去如出一辙的两个文件,竟然大小差了整整一倍多。get

image


使用cat的-v开关,能够查看打印不出来的字符,因而发现了玄机。it

-v, --show-nonprinting
              use ^ and M- notation, except for LFD and TAB


能够看到,windows平台下导出的spec14的workload file里,包含了不少的垃圾字符。

image


查了一下,这种前面带脱字符(^)后面带个其余字符的字符,叫作caret notation。是ASCII中的对控制字符的标识法。

在workload file中出现这么多脱字符符号,是彻底没有意义的,这个应该就个是跨平台的bug。


因为其在Windows平台下的工具下(notepad, notepad++)彻底不可见,而Linux平台下的工具“cat -v”才能看到它们,排查起来真是很是的讨厌。

日后跨平台的东西,这种垃圾字符的问题你们要当心。


参考资料

============

How to replace crlf with lf in a single file

https://stackoverflow.com/questions/27810758/how-to-replace-crlf-with-lf-in-a-single-file

Caret notation

https://en.wikipedia.org/wiki/Caret_notation