記一次錯誤排查,主要問題是跨平臺文件中換行符(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

相關文章
相關標籤/搜索