續上一篇隨筆: https://www.cnblogs.com/kingstarer/p/8469016.html 《工作碰上的技術問題及處理經驗》(二) 我這人記憶力比較差,經常出現有些知識學了不久後就忘了,或者有些問題花了很多時間百度解決後,再過一段時間碰上時只有模糊印象,卻忘了具體解決方法。 ...
續上一篇隨筆: https://www.cnblogs.com/kingstarer/p/8469016.html 《工作碰上的技術問題及處理經驗》(二)
我這人記憶力比較差,經常出現有些知識學了不久後就忘了,或者有些問題花了很多時間百度解決後,再過一段時間碰上時只有模糊印象,卻忘了具體解決方法。
最近幾年工作時我開始有意識地把登記每天工作碰上的技術問題做個簡單筆記。
一般上班時間比較忙,只能草草記了一兩句話。等過一段時間,我會把這個筆記整理一下,把問題和處理經驗整理通順,以加深自己的印象。
20180425: source insight 4裡面高亮某個單詞可以按F8,UE裡面高亮可以用shitf+雙擊單詞,vs裡面預設沒法高亮某個單詞。 不過網上有很多擴展插件可以實現這個功能,我就裝了一個:" Highlight all occurrences of selected word" 今天用filezilla上傳一個文件,總是上傳不成功,但提示為什麼不成功,讓我有點摸不著頭腦。後來偶然發現原來是因為伺服器硬碟滿了。filezilla這點做得不太好,出錯提示太不清楚了。 make -n 可以用來調試makefile,它能顯示makefile實際執行的編譯命令(只列印,不執行)。今天一個同事說他修改的代碼編譯後沒生效,我就讓他用make -n看一下是不是實際執行了編譯。他看了一下編譯命令,才發現他.h文件,然而對應的.c文件並沒有依賴於該.h,導致執行make後沒有重新編譯對應的.c,所以代碼沒生效。make clean後重新編譯就好。 修改了.h後記得make clean,因為很多makefile寫的時候都只依賴.c/.cpp,不依賴.h 20180502: 今天學了一個查看IO使用狀態的命令:iostat -dmx2 20180504: shell的變數與環境變數的區別:都可以使用${變數名}獲取變數值,但有 export的變數是環境變數,環境變數會被子進程繼承,但普通shell變數不會。 20180508: 今天在調試程式時發現程式行為飄忽不定,修改的一個bug有時生效,有時不生效。後來才發現由於我系統裡面把.放在PATH環境變數第一位,導致啟動程式時預設先啟動當前目錄下的程式。 而我的測試環境,有好幾個目錄都放了一個同名的程式。如果不幸在非最新版本的程式目錄下啟動程式測試,則會出錯。 一般來說,最好不要把.做為PATH第一位 20180510: 今天用vs編譯代碼時報這個錯: ">dbstbl.h : warning C4819: 該文件包含不能在當前代碼頁(936)中表示的字元。請將該文件保存為 Unicode 格式以防止數據丟失"。 網上查了一下,是因為代碼格式是UTF-8,並且裡面有中文。而vs是不支持這種格式的代碼的,需要在文件高級保存選項,把文件格式改為“UTF8帶簽名” 20180517: /*巨集裡面寫死了使用變數stMyInf 現在想調用這個巨集,但變數名不一樣*/ #define stMyInf (*pStMyInf) GET_AR_INF(); #undef stMyInf 20180520: secureCRT設置屏幕顯示黑底綠字模式方法: options->sessionoptions->emulation->terminal 選擇vt100 options->sessionoptions->appearance->Current color scheme 選擇traditional secureCRT設置屏幕顯示linux彩色方法: options->sessionoptions->emulation->terminal 把終端類型 從vt100改為xterm 並且鉤選ansi color覆選框 20180521: 今天發現程式從資料庫取出來的數據,結尾總是會多出很多空格。原來以為是因為欄位是char類型緣故, 但後來發現不是,欄位類型是varchar2。後來發現由於取數時,用char類型數組,其實應該用varchar才對(我們的資料庫操作是用pro*c)。 或者在程式開頭使用EXEC SQL VAR強制轉換,如下例子: EXEC SQL BEGIN DECLARE SECTION; char ename[11]; EXEC SQL VAR ac_ename IS STRING(11); EXEC SQL END DECLARE SECTION; 這個用法在oracle官方的proc開發文檔裡面有詳細介紹,建議大家開發proc程式前先瀏覽一遍。(全英的,看起來比較痛苦,但值得) 20180604: 今天出現了一個substr截取字元串時出現半個中文的問題:utf8中文一般是3個位元組,gbk中文是2個位元組,但substr截取時是按位元組截斷,所以很可能出現截斷了中文字元的問題。 這個問題可以通過自己寫一個substr解決了,之前的開發人員寫代碼時沒考慮到這點。 20180620: 我個人比較熟悉awk,所以經常需要在windows上使用awk處理一些數據。 之前一直使用unxutils工具包裡面的gawk.exe,但最近發現它有兩個問題:1 處理的文件行數超過651132時容易出現bug 2 輸出中文時只能重定向到文件,不然會報錯。 我嘗試過直接下載gnuwin裡面的gawk,發現也有這個問題。這個問題我暫時沒有找到解決方法。 今天被oracle的lengthb函數坑了一把:我一直以為lengthb返回的應該是數字,如果傳入空字元串,返回的應該是0。實際上,如果字元串是NULL,lengthb返回的是NULL。 20180626: sed命令使用正則時需要轉義,如:sed 's/abc\|def/xxx/g' 如果ftp連接伺服器失敗,可以在服務患兒使用/sbin/service vsftpd status看看ftp服務是否有啟動。如果啟動了還是連接失敗,可以看看是不是使用了非標準的ftp埠 netstat -anp|grep -w LISTEN 20180628: 今天碰上一個bug是由於snprintf函數引起的。原因是snprintf返回可能超過輸入在緩衝區的長度(當緩衝區能完整容納輸出的字元串,snprintf函數返回往緩衝區寫入的字元數,否則返回緩衝區應該有多長才能容納輸出字元串),而代碼沒有對這種情況做判斷,導致越界。 20180701: gdb單步跟蹤時,如果碰上比較長的迴圈,一步步跟很累人。可以試試使用until命令,讓程式運行到指定代碼行時停下來。 gdb調試過程中,可以使用call命令執行函數。例如運行過程中想退出程式,可以用call exit(0)。 今天又碰上strncpy沒有以\0結尾導致出現bug的情況。 20180702: 字元集和字元集編碼區別: Unicode是字元集,UTF8編碼是對錶示字元集裡面字元的一種編碼規則,GB18030也是一種編碼 20180705: 今天碰上一個問題,程式core後在當前目錄找不到corefile。用ulimit -a和ulimit -c看都沒有限制corefile文件大小。 後來偶然間發現corefile生成在了另一個目錄下麵,原來是在/proc/sys/kernel/core_pattern裡面配置的corefile命名規則裡面把路徑寫死了,所以不會在當前目錄生成。 gdb調試多進程時可以用set follow-fork-mode parent/child 來確定fork後跟蹤父進程還是子進程。 20180709: 今天碰上信號處理函數裡面列印日誌,導致進程死鎖的問題。之前一直以為多線程才會有重入問題,沒想到單進程也會出現這種問題。 20180710: \t預設是補齊8位,但它跟用空格補齊不一樣,雖然游標會後移到滿8位為止,但 20180711: 今天才知道oracle有insert all的語法,作用是把同一批數據插入到不同的表中。 insert all into t1(object_name,object_id) into t2(object_name,object_id) select * from t; insert first when object_id = 1 then into t1(object_name,object_id) when object_id <=5 then into t2(object_name,object_id) select * from t; 20180713: ue搜索替換時可以使用特殊字元 ^p(換行) ^t(tab) 20180715: 今天註意到項目裡面的接入進程實現跟我以前做的項目不大一樣。以前做的多進程接入功能是先打開一個socket並且在主進程進程bind之後linsten,然後fork多個子進程同時accept等待連接進來並處理。 現在項目的多進程接入實現是使用SO_REUSEPORT選項,該選項使用多個socket可以同時綁定同一個監聽埠。這樣就不需要先啟動主進程再fork子進程了,直接同時啟動多個接入進程就行。每個進程都會新開一個socket完整執行bind->linsten->accept。百度查了一下,說這個特性實現的多socket共用埠接入伺服器性能比傳統的父子進程共用同個socket的效率高一點。