0、背景
在生成注冊号開發中,初步的規律已經得到。整個某省分為175個區域,累計注冊号>1億條。
生成注冊号的前期程式都是在程式裡面構造的,且充分驗證ok,某區域的有效資料累計2萬條為證據。
為了實作程式自動化生成一個省的所有注冊記錄,特采取了讀配置的政策。如:前6位機關号寫入配置檔案。
結果就跑了4個小時以上生成了近一億條資料。本來,到這裡也就完了。
可是,Bug出現了。
當我在将近2萬條實驗成功的資料導入到新表中時,發現前14位相同的注冊号,第15位注冊号竟然不同。
很明顯是有Bug了。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SZhFWZlZmNzgjZ1YjMmRDOiRGO0I2MwATZwczNiNjZ58CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
1、Bug溯源
加日志列印後,症狀:正常列印應該為:”str1=270000001800015”,
實際輸出結果為:00015=2700000018。
有明顯的錯亂,記憶體越界的痕迹。
步驟1——初步想到的是:棧變量記憶體配置設定的問題。
(1)配置了空間過大,改成同樣大小14個長度的位元組數。 驗證後,錯誤結果依舊。
(2)改成堆記憶體配置設定,每次進入循環配置設定記憶體,退出循環釋放記憶體。驗證後,錯誤結果依舊。
此過程反反複複,接近20分鐘。
步驟2——進一步跟蹤,字元串的每一個字元都列印出來。當以10進制列印字元的時候,明顯的第7個字元那裡有很大存在某種問題或陰謀。
再仔細想。前6個字元是從檔案中讀入的。多了個回車符。
步驟3——初步敲定原因。
為了編碼的友善,我在windows下編輯的檔案,機關号(前6位)是直接從構造好的Excel中拷貝過去的。
這就導緻了如下内容:
(1)結束符導緻讀到的第7個字元為回車符”r”,不正确。
(2)導緻序列号的第7-15位向前錯1位。
(3)最終導緻出現驗證碼出錯。
整個過程下來耗費近1個小時時間。
2、解決方案:
dos2unix 轉為unix下的檔案格式。
Centos 環境下執行:dos2unix *.txt
3、知識點備忘
(1)換行符:
1).windows中的換行符是rn,
2). linux/unix下的換行符是n。
其中:
回車符:r=0x0d (13) return; #回車
換行符:n=0x0a (10) newline。#換行
(2) unix2dos指令詳解:
對應的将UNIX格式文本檔案轉成成DOS格式的是unix2dos指令。
dos2unix指令用來将DOS格式的文本檔案轉換成UNIX格式的(DOS/MAC to UNIX text file format converter)。
再次強調:
DOS下的文本檔案是以rn作為斷行标志的,表示成十六進制就是0D 0A。
而Unix下的文本檔案是以n作為斷行标志的,表示成十六進制就是 0A。
DOS格式的文本檔案在Linux底下,用較低版本的vi打開時行尾會顯示^M,而且很多指令都無法很好的處理這種格式的檔案,如果是個shell腳本。
而Unix格式的文本檔案在Windows下用Notepad打開時會拼在一起顯示。是以産生了兩種格式檔案互相轉換的需求。
4、結語
(1)dos2unix轉換是在公司裡面非常常用的指令。最近一段時間由于用的少,竟然給忘記。險些誤了大事。
(2)遇見Bug,不要慌張,多角度思考。同理的下午兩表合并的Bug,最終我的解決方案改為:解析原有2萬多條有效資料的表,然後解析的同時,将結果Update到新表中。效率相對較高。
(3)換一個思路,或許會“柳暗花明”、“豁然開朗”。同時操作一個表導緻的死鎖問題,最終的解決方案就是通過: show processlist;找到Locked Id, 然後kill 對應Id掉即可。
作者:銘毅天下
轉載請标明出處,原文位址:
http://blog.csdn.net/laoyang360/article/details/52705922