二級(jí)C++技巧:C++中使用斷點(diǎn)寫(xiě)調(diào)試方法

字號(hào):

C/C++ code:
    f9 --- 設(shè)置/取消斷點(diǎn)
    f10 --- 單步執(zhí)行
    f11 --- 比f(wàn)10的步幅小,f10在函數(shù)的調(diào)用時(shí),直接跳過(guò),在f11下,會(huì)進(jìn)入函數(shù)體!
    f5 --- 執(zhí)行到下一個(gè)斷點(diǎn)!
    了解調(diào)試,首先要知道"斷點(diǎn)"這個(gè)概念.斷點(diǎn)就是程序運(yùn)行中可能會(huì)中斷的地方,方便開(kāi)發(fā)者在程序運(yùn)行的過(guò)程中查看程序當(dāng)前的運(yùn)行狀態(tài),比如變量的值,函數(shù)的返回值等等.究竟怎么使用斷點(diǎn)呢?
    1.F9在當(dāng)前光標(biāo)所在的行下斷點(diǎn),如果當(dāng)前行已經(jīng)有斷點(diǎn),則取消斷點(diǎn).
    F5調(diào)試狀態(tài)運(yùn)行程序,程序執(zhí)行到有斷點(diǎn)的地方會(huì)停下來(lái).
    F10單步執(zhí)行程序.
    CTRL+F10運(yùn)行到光標(biāo)所在行.
    F11和F10的區(qū)別是,如果當(dāng)前執(zhí)行語(yǔ)句是函數(shù)調(diào)用,則會(huì)進(jìn)入函數(shù)里面.
    SHIFT+F11跳出當(dāng)前所在函數(shù).
    特別說(shuō)明:
    a.有的地方不能下斷點(diǎn).比如空行,基本類(lèi)型定義語(yǔ)句(不初始化),等等非執(zhí)行語(yǔ)句.比如
    int i; // 此行不能下斷點(diǎn)
    int j=0;// 這里可以下
    CStringstr;// 這里可以下
    intk = Max(i,j);// 這里可以下
    b.不是所有斷點(diǎn)都會(huì)(斷).比如下斷點(diǎn)的語(yǔ)句在程序里面沒(méi)有被執(zhí)行.
    c.此外,ALT+F9還可以下條件斷點(diǎn),不過(guò)這個(gè)不常用,有興趣的可以自己研究:)
    2.如何調(diào)試Release版的程序?
    有些程序在debug下運(yùn)行的很好,但在release下卻總是失敗,默認(rèn)情況下release是不能調(diào)試的. 怎么解決呢?
    其實(shí)"debug"和"release"都只是一個(gè)代號(hào)而已,各自對(duì)應(yīng)一組不同的編譯選項(xiàng).
    在release的默認(rèn)設(shè)置下,ALT+F7 ,調(diào)出工程設(shè)置對(duì)話(huà)框,切換到link選項(xiàng)卡,勾選"Generate debug info",然后再切換到C/C++選項(xiàng)卡,在"Optimizations"里面選"Disable(Debug)",在下面的"Debug info"里面選"Program Database for Edit and Continue".然后點(diǎn)OK保存設(shè)置,重新編譯程序,下斷點(diǎn)即可.
    3.上面兩點(diǎn)已經(jīng)能應(yīng)付很多種情況了,但是有時(shí)候即使在debug下也不能下斷點(diǎn),我以前也曾經(jīng)遇到過(guò)這種問(wèn)題,一個(gè)調(diào)了層的dll,就是不能下斷點(diǎn).其實(shí)還除了上面的方法,還有一種最底層的實(shí)現(xiàn)技術(shù):使用匯編.
    細(xì)心的人可能會(huì)發(fā)現(xiàn),有時(shí)候在調(diào)試狀態(tài)下當(dāng)程序出現(xiàn)異常的時(shí)候,光標(biāo)會(huì)指向匯編代碼,而這個(gè)代碼就是int 3,這其實(shí)是一個(gè)中斷.
    在你的代碼的任意地方加上
    __asm
    {
    int 3
    };
    用debug編譯,然后直接運(yùn)行程序.當(dāng)程序執(zhí)行到上述代碼的時(shí)候,就會(huì)出現(xiàn)一個(gè)框,告訴你說(shuō)一大堆信息,說(shuō)程序錯(cuò)了,下面有"調(diào)試"、"終止"、"忽略",不用理,點(diǎn)調(diào)試就可以進(jìn)入跟蹤了。