#ifdef DEBUGphp
Printf(「valriable x has value = %d\n」, x)html
#endif前端
而後在編譯選項中加入-DDEBUGnode
更復雜的調試應用如:python
#define BASIC_DEBUG 1linux
#define EXTRA_DEBUG 2c++
#define SUPER_DEBUG 4程序員
#if (DEBUG &EXTRA_DEBUG)web
printf …算法
#endif
在這種狀況下若是設置編譯器標誌爲-DDEBUG=5,將啓用BASIC_DEBUG和SUPER_DEBUG。 標誌-DDEBUG=0將禁用全部的調試信息,也能夠在程序中添加以下語句:
#ifndef DEBUG
#define DEBUG 0
#endif
Gcc編譯的時候要加上-g選項,讓編譯器在程序中添加額外的調試信息。若是正式發佈,這些調試信息可使用strip命令刪除。
Gdb:
Backtrace棧跟蹤
splint功能:
常識性測試併產生一些警告信息。它能夠檢測未經賦值的變量使用,函數的參數未使用等異常狀況。
顯示執行所花費的時間具體都用在什麼操做上。
ElectricFence函數庫和valgrind能夠用來檢查動態內存分配的一些問題,包括內存泄漏。
Linux下的調試工具
隨着XP的流行,人們愈來愈注重軟件的前期設計、後期的實現,以及貫穿於其中的測試工做,通過這個過程出來的天然是高質量的軟件。甚至有人聲稱XP會淘汰調試器!這固然是有必定道理的,然而就目前的現實來看,這仍是一種理想。在平常工做中,調試工具仍是必不可少的。在Linux下,調試工具並不是只有gdb,還有不少其它調試工具,它們都各有所長,側重方面也有所不一樣。本文介紹幾種筆者經常使用的調試工具:
1. mtrace
在linux下開發應用程序,用C/C++語言的居多。內存泄露和內存越界等內存錯誤,無疑是其中最頭疼的問題之一。glibc爲解決內存錯誤提供了兩種方案:
一種是hook內存管理函數。hook內存管理函數後,你能夠經過記下內存分配的歷史記錄,在程序終止時查看是否有內存泄露,這樣就能夠找出內存泄露的地方了。你也能夠經過在所分配內存的首尾寫入特殊的標誌,在釋放內存時檢查該標誌是否被破壞了,這樣就能夠達到檢查內存越界問題的目的。
另一種方法更簡單,glibc已經爲第一種方案提供了默認的實現,你要作的只是在特定的位置調用mtrace/muntrace兩個函數,它們的函數原型以下:
#include <mcheck.h>
void mtrace(void);
void muntrace(void);
你可能會問,在哪裏調這兩種函數最好?這沒有固定的答案,要視具體狀況而定。對於小程序來講,在進入main時調用mtrace,在退出main函數時調用muntrace。對於大型軟件,這樣作可能會記錄過多的信息,分析這些記錄會比較慢,這時能夠在你所懷疑代碼的兩端調用。
另外,還須要設置一個環境變量MALLOC_TRACE,它是一個文件名,要保證當前用戶有權限建立和寫入該文件。glibc的內存管理器會把內存分配的歷史信息寫入到MALLOC_TRACE指定的文件中。
程序運行完畢後,使用mtrace工具分析這些內存分配歷史信息,能夠查出內存錯誤的位置(mtrace在glibc-utils軟件包裏)。
2. strace
在編程時,檢查函數的返回值是一種好習慣。對於像glibc等標準C的函數,光檢查返回值是不夠的,還須要檢查errno的值。這樣的程序每每顯得冗長,不夠簡潔。同時也多是出於偷懶的緣由,大多數程序裏並無作這樣的檢查。
這樣的程序,一旦出現錯誤,用調試器一步一步定位錯誤,而後想法查出錯誤的緣由,也是能夠的,不過比較麻煩,對調試器來講有些大材小用,不太可取。這時,用strace命令可能會更方便一點。它能夠顯示各個系統調用/信號的執行過程和結果。好比文件打開出錯,一眼就看出來了,連錯誤的緣由(errno)都知道。
3. binutil
binutil是一系列的工具,你可能根本不知道它們的存在,可是沒有它們你卻步履維艱。Binutil包括下列工具:
其中部分工具對調試極有幫助,如:
你能夠用objdump反彙編,查看目標文件或可執行文件內部信息。
你能夠用addr2line把機器地址轉換到代碼對應的位置。
你能夠用nm查看目標文件或可執行文件中的各類符號。
你能夠用gprof分析各個函數的使用狀況,找出性能的瓶頸所在(這須要加編譯選項)。
4. ld-linux
如今加載ELF可執行文件的工做,已經落到ld-linux.so.2頭上了。你可能會問,這與有調試程序有關係嗎?有的。好比,在linux中,共享庫裏全部非static的函數/全局變量都是export的,更糟的是C語言中沒有名字空間這個概念,致使函數名極易衝突。在多個共享庫中,名字衝突引發的BUG是比較難查的。這時,你能夠經過設置LD_ DEBUG環境變量,來觀察ld-linux.so加載可執行文件的過程,從中能夠獲得很多幫助信息。LD_ DEBUG的取值以下:
5. gdb
對於真正意義的調試器來講,gdb在linux下是獨一無二的。它有多種包裝,有字符界面的,也有圖形界面的,有單獨運行的,也有集成到IDE中的。gdb功能強大,圖形界面的gdb容易上手一點,但功能無疑受到了一些限制,相信大部分高手仍是願意使用字符界面的。Gdb太經常使用了,這裏再也不多說。
6. gcc/boundschecker
相信不少人用過win32下的BoundsChecker(Compuware公司)和Purify(IBM公司)兩個工具吧。它們的功能實在太強大了,絕非能經過重載內存管理函數就能夠作到,它們在編譯時插入了本身的調試代碼。
gcc也有個擴展,經過在編譯時插入調試代碼,來實現更強大的檢查功能。固然這要求從新編譯gcc,你能夠到http://sourceforge.net/projects/boundschecking/ 下載gcc的補丁。它的可移植性很是好,筆者曾一個ARM 平臺項目裏使用過,效果不錯。
7. valgrind
最好的東西每每最後才見到。Valgrind是個人最愛,用習慣了,寫的程序不在valgrind下跑一遍,就像沒有寫單元測試程序同樣,有點放心不下。它有BoundsChecker/Purify的功能,並且速度更快。
有點遺憾的是valgrind目前只支持x86平臺,固然,這對大多數狀況已經足夠了。
你能夠到http://valgrind.org/ 下載最新版本。
Debugging Tools for C on Linux Platform
http://www.linuxgazette.com/node/view/8755
Submitted by Nikhil Bhargava on Tue, 02/17/2004 - 14:37. Articles | General Interest
This article talks about debugging tools for applications in C on Linux platforms. Most of the tools are freely available on all major platforms with very wide user support. The tools help in static analysis of code as well as assist in dynamic evaluation of code.
Please note that tools listed here are suggestions of the author. This list is not a standard one. Changes have to be done in it depending upon the nature, scope and details of the application to be developed.
Debugging Tools
1. Dmalloc http://dmalloc.com/
The debug memory allocation or Dmalloc library is a freeware debugging tool which has been specially designed as a drop in replacement for the system's malloc, realloc, calloc, free and other memory management routines while providing powerful debugging facilities configurable at runtime. It makes changes during compile time and donot add runtime changes in binary. These facilities include such things as memory-leak tracking, fence-post write detection, file/line number reporting, and general logging of statistics. The library is reasonably portable having been run successfully on at least the following operating systems: AIX, BSD/OS, DG/UX, Free/Net/OpenBSD, GNU/Hurd, HPUX, Irix, Linux, MS-DOG, NeXT, OSF, SCO, Solaris, SunOS, Ultrix, Unixware, Windoze, and even Unicos on a Cray T3E. It has full support for programs the debugging of POSIX threads.
The package includes the library, configuration scripts, debug utility application, test program, and documentation.
2. Valgrind http://valgrind.kde.org/
Valgrind is a GPL distributed system for debugging and profiling x86-Linux programs. I can also be helpful for programs for platforms other than x86 since behavior of x86 binary is similar to other binaries. The accompanying tools with Valgrind automatically detect many memory management and threading bugs, avoiding hours of frustrating bug-hunting, making programs more stable. It supports a through detailed profiling to help speed up the programs.
The Valgrind distribution includes four tools: two memory error detectors, a thread errordetector, and a cache profiler.
3. Electricfence http://rpmfind.net/linux/RPM/conecti...-2cl.i386.html
Electric Fence is a freeware library that can be used for C programming and debugging. It can be linked at compile time and it will warn about possible problems such as freeing memory that doesn't exist, etc. It is basically a memory profiling tool. However currently it is available only on HP-Unix platform (I am not very sure though).
4. GDB http://sources.redhat.com/gdb
This is the Gnome Debugger which comes as a freeware support package with freeware Linux distribution like Red Hat, Slacware, and Debian etc. It has full support of many languages like C, C++, and Perl etc. It helps to debug the binaries of these languages in modes like single step, multiple step or complete run. It also has provisions of setting break points and trace value.
It is helpful for stub testing, functional flow checking and bound checking. Further this is readily available with all flavours of Linux andUnix platforms and is amply supported in user community.
5. Insight http://sources.redhat.com/insight
Insight is a graphical user interface to GDB, the GNU Debugger written in Tcl/Tk by at Red Hat, Inc. and Cygnus Solutions Insight provides all features provided by GDB along with Graphical debugging interface replacing traditional command based interface.
6. Memprof http://www.gnome.org/projects/memprof
MemProf is a free ware memory Profiling and memory leak detection tool which comes as an addendum to common Linux distributions. It can generate a profile how much memory was allocated by each function in the program. It can scan memory and find blocks that have been allocated but are no longer referenced anywhere (dead code).
MemProf works by pre-loading a library to override the C library's memory allocation functions and does not require recompiling the program. One advantage MemProf has over some other similar tools that are available is that it has a nice GUI front-end and is relatively easy to use.
I am Nikhil Bhargava from Delhi, India. I am a Computer Engineer currently working in C-DOT, India for past one year. Comments and Suggestions are always welcome.
儘管你能夠在大多數(即使不是所有)Linux調試 任務中使用GDB,但與長時間坐在GDB命令行前面相比,許多人仍是更願意使用諸如DDD或Eclipse這樣的圖形化工具。從各方面來看,大多數很是花 哨的圖形化調試工具不過是創建在GDB基礎上的一個抽象,因此選擇哪種圖形化工具徹底屬於我的愛好。
本節將介紹兩個這樣的工具,固然還存在其餘許多這樣的工具(包括GDB的前端GNU insight),它們也被各類開發團隊所使用。
從事Linux應用開發一年多了,感受很不規範很山寨,準備系統地學習一下下linux開發,首先從調試工具的學習開始,如下是從網上看到的一篇linux調試工具介紹,準備好好學習這些工具的使用。
「工欲善其事 必先利其器」如今將一些常見的調試工具進行一下總結.
【1】
名稱:MEMWATCH
功能:
一、MEMWATCH 支持 ANSI C
二、它提供結果日誌紀錄
三、能檢測雙重釋放(double-free)
四、錯誤釋放(erroneous free)
五、沒有釋放的內存(unfreed memory)、
六、溢出和下溢等等。
參考文獻:
【1】:
http://blog.csdn.net/lengxingfei/archive/2006/08/09/1040800.aspx
【2】
名稱:YAMD
功能:
一、查找 c 和 c++ 中動態的、與內存分配有關的問題
參考文獻:
【1】
http://www.cs.hmc.edu/~nate/yamd/
【2】
http://www.ppsql.com/server/p262/J26232224_2.shtml
【3】
名稱:electric fence
功能:
一、檢測內存泄露
二、檢查數據越界
三、分配受保護的內存
參考文獻:
【1】
http://book.opensourceproject.org.cn/embedded/oreillybuildembed/index.html?page=opensource/belinuxsys-chp-11-sect-4.html
【2】
http://book.opensourceproject.org.cn/embedded/oreillybuildembed/opensource/belinuxsys-chp-11-sect-4.html
【3】
http://www.ppsql.com/server/p262/J26232224_3.shtml
【4】
名稱:strace
功能:
一、顯示用戶空間程序發出的系統調用
二、顯示調用的參數和返回值
【5】
名稱:gdb
功能:
一、啓動程序
二、使程序可以中止在指定文件的指定位置
三、查看程序變量值
四、改變程序執行期間的相關變量、路徑等
【6】
名稱:Oops
功能: 顯示系統錯誤信息
參考文獻:
【1】
http://www.ibm.com/developerworks/cn/linux/sdk/l-debug/
【7】
名稱:mtrace
功能:
一、檢測一些內存分配和泄漏的失敗等
參考文獻:
【1】
http://www.vbaccelerator.com/home/VB/Code/Techniques/RunTime_Debug_Tracing/mTrace_bas.asp
【2】
http://www.yuanma.org/data/2006/0612/article_789.htm
【3】
http://www.mylinux.com.cn/HTML/1183705958487.html
【8】
名稱:binutil
說明:binutil爲一個工具集合,包含以下的工具。
addr2line 把程序地址轉換爲文件名和行號。在命令行中給它一個地址和一個可執行文件名,它就會使用這個可執行文件的調試信息指出在給出的地址上是哪一個文件以及行號。
ar 創建、修改、提取歸檔文件。歸檔文件是包含多個文件內容的一個大文件,其結構保證了能夠恢復原始文件內容。
as 主要用來編譯GNU C編譯器gcc輸出的彙編文件,產生的目標文件由鏈接器ld鏈接。
c++filt 鏈接器使用它來過濾 C++ 和 Java 符號,防止重載函數衝突。
gprof 顯示程序調用段的各類數據。
ld 是鏈接器,它把一些目標和歸檔文件結合在一塊兒,重定位數據,並連接符號引用。一般,創建一個新編譯程序的最後一步就是調用ld。
nm 列出目標文件中的符號。
objcopy 把一種目標文件中的內容複製到另外一種類型的目標文件中.
objdump 顯示一個或者更多目標文件的信息。顯示一個或者更多目標文件的信息。使用選項來控制其顯示的信息。它所顯示的信息一般只有編寫編譯工具的人才感興趣。
ranlib 產生歸檔文件索引,並將其保存到這個歸檔文件中。在索引中列出了歸檔文件各成員所定義的可重分配目標文件。
readelf 顯示ebf格式可執行文件的信息。
size 列出目標文件每一段的大小以及整體的大小。默認狀況下,對於每一個目標文件或者一個歸檔文件中的每一個模塊只產生一行輸出。
strings 打印某個文件的可打印字符串,這些字符串最少4個字符長,也可使用選項-n設置字符串的最小長度。默認狀況下,它只打印目標文件初始化和可加載段中的可打印字符;對於其它類型的文件 它打印整個文件的可打印字符,這個程序對於瞭解非文本文件的內容頗有幫助。
strip 丟棄目標文件中的所有或者特定符號。
libiberty 包含許多GNU程序都會用到的函數,這些程序有: getopt, obstack, strerror, strtol 和 strtoul.
libbfd 二進制文件描述庫.
libopcodes 用來處理opcodes的庫, 在生成一些應用程序的時候也會用到它, 好比objdump.Opcodes是文本格式可讀的處理器操做指令.
功能:程序調試、歸檔等
參考文獻:
http://man.chinaunix.net/linux/
【9】
名稱: Purify
功能:內存檢查工具
參考文獻:
http://blog.csdn.net/haoel/archive/2003/12/16/2904.aspx
【10】
名稱:pc-lint
功能:C/C++的靜態代碼檢測工具
參考文獻:
【1】
http://dev.yesky.com/134/2593634.shtml
【11】
名稱:splint
說明:splint是一個動態檢查C語言程序安全弱點和編寫錯誤的程序
功能:
一、空引用錯誤
二、未定義的變量錯誤
三、類型錯誤
四、內存檢查
參考文獻:
【1】
http://www.turbolinux.com.cn/turbo/wiki/doku.php?id=splint&DokuWiki=e3b300af2d101a8bec5a4c805e678823
【2】
http://www.splint.org/
【12】
名稱:boundercheck
功能:檢查內存泄露
【13】
名稱:valgrind
功能:
一、檢查內存錯誤
參考文獻:
http://blog.donews.com/idlecat511/archive/2006/02/21/736877.aspx
IDA最知名的是反彙編器,它是二進制文件執行靜態分析的最佳工具之一。因爲現代反靜態分析技術的複雜性,人們經常將靜態分析與動態分析技術結合起來,以利用兩者的優點。理想狀況下,全部這些工具集成在一個軟件包中。Hex-Rays在推出4.5版的IDA調試器時,作出鞏固IDA的做用將其做爲一個通用的逆向工程工具這一舉動。隨着IDA的後續版本,調試功能獲得改善。在最新版本中,IDA可以在多個不一樣的平臺上進行本地和遠程調試,並支持多種不一樣的處理器。
Rythem是什麼 Rythem是一個與Fiddler同類的軟件,和Fiddler同樣具備 代理抓包/替換 功能,與Fiddler最大的不一樣是Rythem是跨平臺&開源的。 官方詳細介紹: http://www.alloyteam.com/2012/05/web-front-end-tool-rythem-1/ 如下爲Rythem運行的截圖:(MacO...更多Rythem信息 |
YAGAC 是一個庫用來連接到你的C程序,讓您能夠方便地跟蹤應用程序中的內存泄漏問題。根據你的代碼部分。它跟蹤你的代碼只分配內存,不監測第三部分庫,你能夠有多個垃圾收集。跟蹤能夠被激活的更新調試標誌,而無需從新啓動您的應用程序。其目的是爲守護程...更多YAGAC信息 |
最近更新: YAGAC 0.99-4.0 發佈,C 程序內存泄漏檢測 發佈於 1年前
libcsdbg 是一個 C++ 異常堆棧跟蹤器。當異常被拋出、捕獲和處理時,libcsdbg 提供可工具來建立和處理異常堆棧的跟蹤,並經過調用堆棧來傳播異常路徑。跟蹤器提供異常發生的函數以及額外的 addr2line 信息(源碼級別) 功能列表: 複雜的異常堆棧跟蹤(支持...更多libcsdbg信息 |
最近更新: libcsdbg 1.23 發佈,C++ 異常堆棧跟蹤器 發佈於 4天前
GDB(GNU symbolic debugger)簡單地說就是一個調試工具。它是一個受通用公共許可證即GPL保護的自由軟件。 象全部的調試器同樣,GDB可讓你調試一個程序,包括讓程序在你但願的地方停下,此時 你能夠查看變量,寄存器,內存及堆棧。更進一步你能夠修改變量...更多GDB信息 |
最近更新: GDB 7.7 發佈,程序調試工具 發佈於 12天前
GNU DDD (Data Display Debuger) 是一個圖形化的調試工具,經過對調試命令例如 GDB、DBX、WDB、JDB、XDB 等等命令行工具的封裝,提供一個很是友好的調試界面。更多DDD信息 |
strace是Linux環境下的一款程序調試工具,用來監察一個應用程序所使用的系統呼叫及它所接收的系統信息。 strace是一個有用的小工具,它能夠經過跟蹤系統調用來讓你知道一個程序在後臺所作的事情。Strace是一個基礎的調試工具,在大多數Linux系 統上默認已經...更多strace信息 |
靈活自由是C/C++語言的一大特點,而這也爲C/C++程序員出了一個難題。當程序愈來愈複雜時,內存的管理也會變得越加複雜,稍有不慎就會出現內存問題。內存泄漏是最多見的內存問題之一。內存泄漏若是不是很嚴重,在短期內對程序不會有太大的影響,這也使得內...更多Visual Leak Detector信息 |
Valgrind是一個運行時診斷工具,它能夠監視 一個指定程序的活動並通知你在你的代碼中可能存在的各類各樣的內存管理問題。它相似於老式的Electric Fence工具(該工具將標準的內存分配函數替換爲本身的函數以提升診斷能力),但被認爲更容易使用而且在多個方...更多Valgrind信息 |
最近更新: Valgrind 3.9.0 發佈,運行時診斷工具 發佈於 3個月前
KDbg 是一個 gdb 調試工具的圖形化界面的工具(點擊查看大圖)。更多KDbg信息 |
最近更新: KDbg 2.5.4 發佈,圖形化的調試工具 發佈於 3個月前
OLLYDBG是一個新的動態追蹤工具,將IDA與SoftICE結合起來的思想,Ring 3級調試器,很是容易上手,己代替SoftICE成爲當今最爲流行的調試解密工具了.同時還支持插件擴展功能,是目前最強大的調試工具.更多OllyDbg信息 |
LLDB 是下一代高性能的調試器,構建一組可重用的組件,覆蓋不少 LLVM 項目的庫,例如 Clang 表達式解析器和 LLVM 反彙編器。目前該項目還處於前期開發狀態,但已經注意支持在 Mac OS X 上的 C/C++ 和 Objective-C 的開發。...更多LLDB信息 |
有很多開發者使用Visual Studio®提供的工具Spy++。使用Spy++,你能夠了解一個運行中的應用程序的窗體佈局或肯定一個致使bug的特定窗體消息。然而,當你建立一 個基於Microsoft® .NET框架的應用程序,Spy++變得不太管用了,由於由Spy++截取窗體消息和類不...更多Managed Spy信息 |
您還在使用gdb緩慢地調試UNIX/LINUX的程序嗎?XBuildStudio是專爲提高UNIX/LINUX的程序的開發而設計的在WINDOWS平臺上調試UNIX/LINUX程序的開發工具,操做方式相似VC的環境,有效提高您的工做效率.更多XBuildStudio信息 |
cgdb,能夠當作是gdb的終端界面加強版,相比windows下的visual studio而言,它的功能顯得十分輕量級而沒有太多繁雜,能在終端裏運行。更多CGDB信息 |
EDB (Evan's Debugger) 是一個基於 Qt4 開發的二進制調試工具,主要是爲了跟 OllyDbg 工具看齊,經過插件體系可進行功能的擴充,當前只支持 Linux ,未來會發布其餘平臺的版本。更多EDB (Evan's Debugger)信息 |
最近更新: Evan's Debugger 0.9.20 發佈,二進制調試工具 發佈於 1個月前
BuGLe 結合圖形化的OpenGL調試與選擇的過濾器上的OpenGL命令流。調試器能夠查看狀態、紋理、framebuffers ,着色器,而過濾器容許日誌,錯誤檢查,自由相機控制,視頻捕捉等。更多BuGLe信息 |
uuSpy工具很相似於Spy++。此外,還能夠查看[***]的密碼,甚至取得Internet Explorer的HTML。使用uuSpy你能夠知道正在運行的窗口程序的結構。或者監視致使程序出錯的特定的窗口消息。甚至你能夠輸出指定窗口的 style/exstyle,或作某些設置。 uuSpy能夠對指...更多uuSpy信息 |
Crackerjack Project 是由中日韓三方共同參加開發,該項目主要目的是爲Linux內核提供自動化的迴歸測試功能,以幫助提升內核開發質量等,項目包括一個完整的內核自動化測試框架,以實現自動化載入、執行、管理測試用例,還包括定義新的測試程序(用例),集...更多CrackerJack信息 |
pev是一個小巧的基於命令行的windows可執行文件(PE)分析工具,支持linux、windows和OSX系統。特別的是它使用ANSI標準c編寫,所以能夠容易的在多個平臺上編譯。pev免費而且開放源代碼。更多pev信息 |
MEMWATCH 由 Johan Lindh 編寫,是一個開放源代碼 C 語言內存錯誤檢測工具。只要在代碼中添加一個頭文件並在 gcc 語句中定義了 MEMWATCH 以後,您就能夠跟蹤程序中的內存泄漏和錯誤了。MEMWATCH 支持 ANSI C,它提供結果日誌記錄,能檢測雙重釋放(double-...更多memwatch信息 |
|