日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

cfree运行程序错误_C/C++程序调试和内存检测

發(fā)布時(shí)間:2025/3/15 c/c++ 62 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cfree运行程序错误_C/C++程序调试和内存检测 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

程序出現(xiàn)錯(cuò)誤很正常,一個(gè)優(yōu)秀的程序員必須學(xué)會(huì)調(diào)試,發(fā)現(xiàn)錯(cuò)誤并改正。減少程序錯(cuò)誤最有效的方法是:在敲代碼之前,多花點(diǎn)時(shí)間思考,如何構(gòu)造程序,數(shù)據(jù)結(jié)構(gòu)和算法,盡量把細(xì)節(jié)提前寫下來(lái),可以嘗試著在紙上寫出核心代碼,這樣可以減少今后修改代碼的時(shí)間。

1、常用的調(diào)試技巧

(1)代碼檢查,重新閱讀程序,排除比較明顯的錯(cuò)誤。編譯時(shí)帶上-Wall參數(shù),生成所有的警告信息。

gcc -Wall -pedantic -ansi 表示以ansi/iso生成所有的警告西信息。

(2)取樣法:在程序中增加一些代碼,收集更多與程序運(yùn)行時(shí)的行為相關(guān)的信息。使用條件編譯,可以清楚的辨別哪些是調(diào)試代碼,有利于調(diào)試后的代碼整理。

例如:

程序編譯時(shí)可以選擇性的加上-DDEBUG。如果加上這個(gè)標(biāo)志,就定義了DEBUG這個(gè)符號(hào),從而在程序中包含調(diào)試用的額外代碼,沒有加上該標(biāo)志,這些調(diào)試代碼將刪除。

(3)程序的受控執(zhí)行。用調(diào)試器來(lái)控制代碼的運(yùn)行,隨時(shí)查看這些變量的狀態(tài)。

為了能夠調(diào)試程序,需要在編譯和鏈接時(shí)為每個(gè)源文件加上編譯選項(xiàng)參數(shù)。這些選項(xiàng)的作用是讓編譯器在程序中添加額外的調(diào)試信息。這些信息包括符號(hào)和源代碼行號(hào),調(diào)試器將利用這些信息向用戶顯示程序已經(jīng)執(zhí)行到的源代碼的位置。-g標(biāo)志是對(duì)程序調(diào)試性編譯時(shí)常用的一個(gè)選項(xiàng)。調(diào)試信息的加入使可執(zhí)行程序的長(zhǎng)度成倍的增長(zhǎng)、容量增加,程序運(yùn)行時(shí)的內(nèi)存數(shù)量還是和原來(lái)一樣,程序調(diào)試結(jié)束后,最好還是將調(diào)試信息從程序的發(fā)行版中刪除。

2、使用gdb進(jìn)行程序調(diào)試

常用功能命令:

g++ -g -o test test.cpp //編譯時(shí)加上-g參數(shù)

1、啟動(dòng)gdb: gdb test

2、help

3、具備帶有歷史記錄的命令行編輯功能,方向鍵選擇之前執(zhí)行過(guò)的命令,直接回車鍵再次執(zhí)行最近執(zhí)行過(guò)的那條命令。單步調(diào)試非常有用。

4、quit:退出

5、run:執(zhí)行這個(gè)程序,程序運(yùn)行失敗時(shí)gdb會(huì)報(bào)告失敗的原因和位置。

6、backtrace(bt):棧跟蹤,失敗時(shí)停止的位置,幫助我們找到程序到達(dá)錯(cuò)誤地點(diǎn)的路徑。

7、print:run 后檢查變量,注意變量的生命期。

8、打印圍繞當(dāng)前位置前后的一段代碼,繼續(xù)使用list可以顯示更多的代碼。

9、設(shè)置斷點(diǎn),停止程序的運(yùn)行,查看變量。help breakpoint,break lineNumber,cont,end,display,disable breakpoint number,clear,commands breakpointNumber.

10、設(shè)置斷點(diǎn)后經(jīng)常使用單步調(diào)試命令next(n),查看程序運(yùn)行的細(xì)節(jié)。

3、valgrind內(nèi)存調(diào)試

動(dòng)態(tài)內(nèi)存分配很容易出現(xiàn)程序漏洞,必須清楚自己分配的每一塊內(nèi)存,而且要確定沒有使用已經(jīng)釋放的內(nèi)存塊,非常重要。內(nèi)存調(diào)試的工具有很多,這里使用的是valgrind工具。在centos 7中直接使用 yum install valgrind 安裝。

上面簡(jiǎn)單的代碼編譯運(yùn)行不會(huì)發(fā)生錯(cuò)誤,但是實(shí)際上發(fā)生了很嚴(yán)重的內(nèi)存問(wèn)題。ptr[3]訪問(wèn)越界,std::cout <<ptr[i],讀已經(jīng)釋放過(guò)的內(nèi)存。

通過(guò)valgrind工具可以檢查出來(lái):

[xgwang@localhost Desktop]$ g++ -g -o test2 test2.cpp

[xgwang@localhost Desktop]$ valgrind ./test2

==21739== Memcheck, a memory error detector
==21739== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==21739== Using Valgrind-3.10.0 and LibVEX; rerun with -h for copyright info
==21739== Command: ./test2
==21739==
==21739== Invalid write of size 4
==21739== at 0x40081E: main (test2.cpp:8)
==21739== Address 0x5a1504c is 0 bytes after a block of size 12 alloc'd
==21739== at 0x4C2A7AA: operator new[](unsigned long) (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==21739== by 0x400811: main (test2.cpp:7)
==21739==
==21739== Invalid read of size 4
==21739== at 0x40083F: main (test2.cpp:11)
==21739== Address 0x5a15044 is 4 bytes inside a block of size 12 free'd
==21739== at 0x4C2B5E1: operator delete[](void*) (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==21739== by 0x400836: main (test2.cpp:10)
==21739==
0==21739==
==21739== HEAP SUMMARY:
==21739== in use at exit: 0 bytes in 0 blocks
==21739== total heap usage: 1 allocs, 1 frees, 12 bytes allocated
==21739==
==21739== All heap blocks were freed -- no leaks are possible
==21739==
==21739== For counts of detected and suppressed errors, rerun with: -v
==21739== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 2 from 2)

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的cfree运行程序错误_C/C++程序调试和内存检测的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。