編程不經歷錯誤或警告,怎能見彩虹,沒有人能隨隨便便成為高手。身為程序員的我們,如果哪一天沒有了錯誤或警告的提示,一定會有一種不祥的預感,對吧,都懂的。編程N年來,碰到過的問題多得自己都記不清了,你也一樣,如果可以選擇,我願時光倒流,真希望都能記下來,現在就可以寫本《錯誤集》了,
。下面是我心情好時,有想法時,隨手記下的幾個錯誤或警告,遺憾的是,這些年,就記下那么幾個而已,見笑了,希望能給像我一樣在路上的人有些幫助或提示。
1.提領指向不完全類型的指針
struct hostent
{
char *h_name;
char **h_aliases;
int h_addrtype;
int h_length;
char **h_addr_list;
#defineh_addr h_addr_list[0]
};
沒有包含頭文件,哈哈
比如這個結構,盡管在頭文件中已經包含或定義,但對這個結構體的成員(hptr->h_name)變量進行訪問時,編譯無法通過,顯示編譯器錯誤提示為“提領指向不完全類型的指針”。
對於結構體來說雖然所有的變量默認都是公有的,但是,如果想訪問里面的成員變量,必須有包含對其結構的定義,否則出現如上的錯誤,c編譯器將無法識別結構里面的變量,一般想操作結構體里的成員變量,都是通過調用結構體中定義的函數接口,來取得結構體中的值,如果想直接訪問,在頭文件或源文件中加入結構體的定義就行了。
2.警告:賦值 makes pointer from integer without a cast
同樣因為沒包含頭文件。
3.previous implicitdeclaration of 'Base64_Code' was here
Base64_Code函數未定義,如果要使用 Base64_Code函數,則要先定義。
4.警告:use of cast expressions aslvalues is deprecated
(short)buf[2] =atoi(&data[4]);不贊成把強制類型轉換的結果作為左值
5.warning: initializationdiscards qualifiers from pointer target type
initialization取消了指針目標類型的限定。
6.glibc detected *** free():invalid next size (normal)
是內存泄露的問題。
(1)一般是free了沒有分配的內存
(2)還有就是分配了內存忘記釋放也有可能會出現這樣的問題。
(3)最后查出來是數組循環的時候越界了 , 寫到了其他的內存里面, 然后一free那個區域就出現了這樣的問題。
是有allocate引起的,一個debug的方法是把你懷疑的矩陣(比如釋放了就會報內存錯誤)定義成靜態的,這樣如果出現越界,會報段錯誤。依次檢查是否你的數組真的越界了。
7. undefined referenceto `__gxx_personality_v0'
gcc main.c animal.o后,出現這個錯誤(c與c++混合編程中),解決:gcc main.c animal.o -lstdc++ 錯誤原因:是因為你用gcc編譯.cpp文件.按系統默認.cpp文件是c++的文件格式
8.rmmod:gpio_i2c_LVP1008.ko: Resource temporarily unavailable
[root: 1st]#lsmod //查看一下當前加載的模塊
driver 1256 0- Live 0xbf00c000
device 1560 0- Live 0xbf006000
bus 1336 2driver,device, Live 0xbf000000 //模塊的引用計數,bus模塊被device和driver引用
[root: 1st]# rmmodbus //如果你要卸載bus模塊,它會提示出錯,要先卸載driver和device
rmmod: remove'bus': Resource temporarily unavailable
[root: 1st]#rmmod driver
usb driverbye!
[root: 1st]#rmmod device //卸載device時,內核自動調用device結構體中指定的release函數
<kernel>release
usb device bye!
[root: 1st]#lsmod //bus的引用計數為0,可以卸載bus了
bus 1336 0 -Live 0xbf012000
[root: 1st]#rmmod bus
usb bus bye!
9. error: expectedidentifier before numeric constant錯誤。
原因:定義的enum結構體與其它處的宏定義有沖突。
10.warning: missing bracesaround initializer
原因:結構體初始化失敗。
11.too many agrument
一種原因:參數多於10個。
12. /usr/bin/ld: cannot find-lxxx
原因:找不到對應庫文件。其中,-lxxx表示鏈接庫文件 libxxx.so。
一般出現這種錯誤有以下幾種原因:
1.系統缺乏對應的庫文件;
2.版本不對應;
3.庫文件的鏈接錯誤;
4.庫文件路徑設置問題。
對應第一第二種情況,可以通過下載安裝lib來解決,ubuntu大多數可以直接通過apt-get來安裝:
apt-get install libxxx-dev
一般遇到這種問題筆者第一時間也是會去檢查系統是否已安裝該lib或者是否已選擇正確版本(只是習慣問題),如果還是不能解決問題,那么,引起錯誤的原因不是鏈接錯誤就是庫文件路徑問題了。
通過find或者locate指令定位到鏈接文件,查看鏈接文件是否正確的指向了我們希望的lib,如果不是,用ln -sf */libxxx.so.x */libxxx.so 指令修改它。
如果是庫文件路徑引發的問題,可以到/etc/ld.so.conf.d目錄下,修改其中任意一份conf文件,(可以自建conf,以方便識別)將lib所在目錄寫進去,然后在終端輸入ldconfig 更新緩存。
13.在控制台提示:Semop lock failureIdentifier removed
Semop unlock failure Identifier removed
解決辦法:運行應用程序,比如:client-qws& 去掉-qws 因為只有Server 才需要 -qws&。&為后台運行的標識。
14.Segmentation fault
數組越界或訪問空、野指針或未被初始化的指針都會出現這個問題。
15.安裝VMware: The MSI'C:\Users\dell\AppData\Local\Temp\vmware_1344246656\vmwarevmcisockets64.msi'failed
清空注冊表中vmware信息(或者下載一個VM卸載工具):
1、開始->運行,輸入:regedit;
2、在注冊表中,找到:HKEY_LOCAL_MACHINE\SOFTWARE\VMware並刪除。
VMware Workstation unrecoverable error:(vmx)錯誤
解決:刪除或修改虛擬機目錄下拓展名為.vmss(33.3M)文件,再次啟動即可。 一般為centos5.6-d4cf3290.vmss文件。
16.arm板運行時出現Can't retrieve login name
原因:RTP的JRTPLIB庫中的RTPSession中的Create->InternalCreate->CreateCNAME中,有對用戶名進行一定操作,其中的getlogin_r(),getlogin()和getenv()操作都會因為用戶名為空,而返回錯誤 ERR_RTP_SESSION_CANTGETLOGINNAME。
解決的方式有3種:1)export LOGNAME=root 2)大部分開發板還是需要用戶名登陸的,即在文件系統完全啟動后再運行,也能解決。 3)因為板子上的文件系統有時不需要用戶名就可以直接登錄,而在我們可以通過修改JRTPLIB庫的CreateCNAME源代碼來為系統默認設置一個用戶名。在RTPSession.cpp的第1400行。
17. warning: control reaches end of non-void function
解決:函數結尾無return返回值導致的,在函數最后加一句return 0。
18.could not read symbols: 文件格式錯誤
19.insmod: can't insert 'xxx.ko': unknown symbol in module, or unknown parameter
解決辦法:通過信息中的綠色背景信息,可以找到解決辦法:在內核模塊源碼文件中添加MODULE_LICENSE("GPL");
20.MMB LEAK(pid=2876): 0xC68B9000, 32768 bytes, '' mmz_userdev_release: mmb<0xC68B9000> mapped to userspace 0x40f50000 will be force unmaped!
解決:客服端跟服務器端進行socket通信時,服務器異常斷開,而客戶端並不知道服務器已經斷開,繼續向服務器發送數據,從而引發了SIGPIPE信號,內核響應這個信號,強行終止了程序;
#include <signal.h> signal(SIGPIPE, SIG_IGN);
還有一種可能就是代碼中循環判斷嵌套層次達到四次,被GCC編譯器優化后運行時會出現這種錯誤。只要降低循環判斷嵌套層次即可。
21.mount: 192.168.1.211:/work/nfs failed, reason given by server: Permission denied
1)修改 /etc/exports
/work/nfs 192.168.1*(rw,insecure,sync) //網段不對
2)然后重啟服務
service nfs restart
22. 開發板能ping通路由器,但ping不通外網
vi /etc/resolv.conf
nameservice 192.168.2.1
因為1,2網段不斷切換,但域名服務器未改變。
我想,錯誤不在於多寡以及自己筆記記下了多少,而是在於能養成一種良好的習慣,編程以邏輯為重,比如最為簡單的if(0 == i),錯誤的鎖定及調試手段#define _DEBUG(msg...) printf("[ %s,%s, %d ] ",__FILE__, __FUNCTION__, __LINE__); printf(msg);printf("\r\n")等等等等…………
注:本文經過整理,轉載自http://blog.csdn.net/sbvfhp/article/details/9239531