1. 程式人生 > >我暈,一個低階錯誤導致我DEBUG兩天(std::string c_str()的問題)

我暈,一個低階錯誤導致我DEBUG兩天(std::string c_str()的問題)

起因是這樣的,為了方便讀取RO裡的素材,我在OPenRO里加入了一個第三方庫,他的作用主要就是負責提取RO素材資料,並把他們放在heap裡,程式退出他會自動釋放。

但是莫名其妙的問題隨之而來了:每次程式退出都會彈窗提示:“******,其原因可能是堆被損壞,這也說明****載入的Dll可能有問題”。看見這個,我第一反應是Dll裡分配的記憶體在程式裡釋放時,Dll與exe使用了不同的C執行時庫。但是我使用的這個第三方庫根本就是一個靜態lib啊,而且使用的C執行時庫版本絕對是一樣的。

我就鬱悶了,剩下只有一種解釋,這個lib有問題,可能其中的處理會導致堆損壞,比如越界寫入,delete不存在的記憶體等。於是我就抱著找出這個BUG的信念,從頭到尾把這個庫給看了一遍。

一天完了,一無所獲。

第二天,發現了更詭異的問題,我用這個第三方庫載入了不同的素材,程式退出依然彈窗提示,但是從除錯堆疊視窗看到的結果卻不一樣,顯示的是我自己的模組堆損壞。這樣,我又把自己的程式檢查了一遍,還是沒發現問題。。。(其實後來其實發現這個問題也是理所當然,因為整個堆損壞了嘛,可能覆蓋了其他記憶體塊)

我開始懷疑是我WIN7下不相容VS2005的問題。又難得轉成VS2008,正準備放棄這個BUG待以後解決時,採用了Google到的一個方法,在程式程式碼中加入:

_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_DELAY_FREE_MEM_DF | _CRTDBG_CHECK_EVERY_1024_DF | _CRTDBG_CHECK_CRT_DF);


_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_DEBUG | _CRTDBG_MODE_WNDW);

這樣程式就回提示你程式碼哪裡的操作會導致堆損壞,比如越界等。雖然我試驗提示的區域還是反彙編,但是從除錯堆疊我找到了堆損壞的源頭。看了差點沒把我氣死,這個錯誤在金山實習時就被BOSS指出來過,雖然當時我的程式碼並沒有觸發這個BUG。。。。

void SomeFunction(const char* str);

std::string str;
SomeFunction(str.c_str());

看似非常正常的一段程式碼,但是,顯然,str.c_str()的生存期是由str管理的,一旦str銷燬,c_str()也就銷燬了,如果SomeFunction繼續處理這個指標,那就不曉得損壞的是堆裡面的哪塊記憶體了,結果就是導致一系列詭異的BUG,讓你很難找到錯誤的源頭。所以,建議,使用string的c_str()函式時,需要非常謹慎。

發現經常DEBUG,有些問題還是很通用的,所以建立一個DEBUG標籤,記錄一些DEBUG經驗。

相關推薦

一個低階錯誤導致DEBUGstd::string c_str()的問題

起因是這樣的,為了方便讀取RO裡的素材,我在OPenRO里加入了一個第三方庫,他的作用主要就是負責提取RO素材資料,並把他們放在heap裡,程式退出他會自動釋放。 但是莫名其妙的問題隨之而來了:每次程式退出都會彈窗提示:“******,其原因可能是堆被損壞,這也說明****

因為一個低階錯誤生產資料庫崩潰了將近半個小時

#### 前言 halo,相信大家一定過了一個很開心的端午節吧,我看朋友圈裡各種晒旅遊,晒美食的,真是羨慕啊,不像我,感冒了只能在家擼文章。 當然,玩的多開心,節後上班就有多鬱悶,假日綜合徵可不是說說而已。對此我想表達的是,沒事,不用鬱悶,來看我如何自爆家醜來讓你們開心下。 #### 反常的sql語句 上週

要被打死的一個Excel的匯出寫了一百多行程式碼

反正都要被打死,所以把這個例子記下來吧,一個學習的辛苦歷程! /** * 匯出Excel * @param request 請求物件 * @param response 相應物件 * @return * @throws Exception 匯

一個錯誤半天時間

spring+mybatis,啟動時,停止在 2015-09-09 10:40:22.627:INFO:oejs.Server:jetty-8.1.14.v20131031 2015-09-09 10:40:22.878:INFO:/:No Spring WebApplic

<20190102>收錄些比較低階錯誤導致的主機板故障現象

今天收錄倆個比較低階的錯誤.    故障現象:   水冷排風扇高速運轉, 並無法調控. 現在CPU散熱的水冷排都設計了三條線,   溫控4Pin , 水泵線 3Pin  , 接在機箱上USB口取電的燈線或者水泵輔助線. 

mysql主從複製一個錯誤導致從庫不更新資料

由於歷史遺留問題,我們的MySQL主從庫的表結構不一致,主庫的某個表tableA比從庫表tableA少了一個欄位。 當嘗試在主庫上更改表結構時,這行alter語句會隨著binlog同步到從庫,如果從庫執行這行語句時出錯,主從同步執行緒就會自動停止,那樣只能人為手動處理錯誤,然後再啟動slave上的主從同步執

在建立帶輸出引數和返回值的儲存過程時---犯下的一個低階錯誤

錯誤如圖,怎麼執行都沒有自己想要的效果(return掉了,還有個啥???!!!) 處理後: if exists(select * from sysobjects where name='usp_AllPmsTest') drop proc usp_AllPmsTest go c

今天遇到了一個低階錯誤!java.lang.reflect.invocationtargetexception 錯誤問題

我是利用反射寫的,其中在一個servlet頁面從JSP頁面中獲取引數時我寫錯了,我的JSP頁面的form表單大致如下:<form>    <input type = "text" name = "customerName" value = "he">&

單機執行Spark Shell遇到的一個低階錯誤

bin/spark-shell 下載spark-2.1.0-bin-hadoop2.7.tgz,解壓縮直接進入spark根目錄,然後執行bin/spark-shell即可進入。 但是今天遇到了一個低階錯誤: java.net.BindException:

一個低階錯誤折磨了

正確的web.xml應該是這樣的:<?xml version="1.0" encoding="ISO-8859-1"?><web-app>  <servlet>        <servlet-name>HelloWorld&l

一個低階錯誤引發Netty編碼解碼中文異常

前言 最近在調研Netty的使用,在編寫編碼解碼模組的時候遇到了一箇中文字串編碼和解碼異常的情況,後來發現是筆者犯了個低階錯誤。這裡做一個小小的回顧。 錯誤重現 在設計Netty的自定義協議的時候,發現了字串型別的屬性,一旦出現中文就會出現解碼異常的現象,這個異常並不一定出現了Exception,而是出現瞭解

一個技術人最重要的是:極客精神好奇心 + 探索欲

重要 大神 net 最大的 程序員 領域 實戰 探索 市場需求 一個技術人,最重要的是:極客精神(好奇心 + 探索欲) 初到社會,面對眾多的IT企業,我們是陌生與好奇的,認為所有企業都是管理一流並且高大上等的。然而工作多年以後你會發現,國內的

的測試用例設計-02用例組成元素用例模板

關於 基礎 工具 使用 display 靈活 ges 模塊 技術 可以這麽說,每一家公司對於測試用例的設計規範、風格和用例的組成元素(填寫的字段)都一樣,但都大同小異,不同只是來源於公司對於某些實際需求來帶來的差異。 一般基本的測試用例都具有以下基礎的組成元素:用例編號、

在北京寫代碼 寫出心中悲與喜 寫出人間的悲歡離合 歡迎閱讀 的第三章 使用集合組織相關數據泛型集合

nes -s ear 插入元素 資源管理 底層 動態 用途 key) ArrayList arry = new ArrayList(); arry.Add("小明"); arry.Add("小D"); arr

ireport報表製作一個欄位顯示的資料太多時資料過長則需要自動換行

1、當一個欄位顯示的資料太長,一個表格放不下,則需要自動換行,選中要更改的表格(要顯示動態內容的欄位),設定屬性Stretch with overflow 為鉤選狀態。 未勾選之前:   勾選之後:   2、但是,表格出現斷層的情況

.NET/C# 異常處理:寫一個空的 try 塊程式碼而把重要程式碼寫到 finally 中Constrained Execution Regions

不知你是否見過 try { } finally { } 程式碼中,try 塊留空,而只往 finally 中寫程式碼的情況呢?這種寫法有其特殊的目的。 本文就來說說這種不一樣的寫法。 本文內容 空的 try 塊 受約束的

的程式設計師成長之路:EOM簡介2程式設計師篇

上篇談到自己程式設計師成長之經歷,也大致談到了EOM來龍去脈,那什麼是EOM呢? 我們發現企業所有活動都可以歸結於企業經營,EOM就是從企業經營這個源頭著手,對經濟生活中的大量企業經營行為進行抽象,並用模型的方式來定義企業經營。(EOM並不僅僅針對企業資訊化,它還在經濟學、企

讀過的且比較好的書的集合持續更新中

1、Computer Systems: A Programmer's Perspective (2nd Edition) 下載連結 在上研究生時讀過前幾章中文版,後來由於找工作時間有限就沒有往下繼續。工作後,需要學習MIPS架構的知識,讀完《See Mips Run》後

十年風雨一個普通程式設計師的成長之路

受大飛的文字及李瑩大哥的影響,也寫了篇自己畢業以來,十年生涯的回顧。還在沉默王二的文章激勵下一鼓作氣把公眾號開通了,發了這篇公眾號的首篇文章。 終於開通了自己第一個公眾號,發表了第一篇文章。看著空白的公眾號頭像,哈哈,感覺還蠻不錯。 以下是正文: 引子 十年,從月薪600到15000,從電腦維修員到一個程式設

十年風雨一個普通程式設計師的成長之路

海風.寧波 2012年5月,又是一次外包的工作。 此時的工資已經是5500,出差補助每天50,包住,算下來,每月也能結餘5000以上了。 這次是外包到寧波,給神州數碼做一個外包專案。 哦,神碼,我的神碼。 才到寧波的第一天,就已讓我產生了厭煩的心理。 甲乙丙丁,點到誰是誰。很不幸,我們屬於那個丁,外包給了丙,