锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
1.灝哻onfigure鏂囦歡鐨?455鍒?467琛屾敞閲婃帀.
2.淇敼libutil/path.c鏂囦歡. 鍦╥nclude涔嬪悗娣誨姞:
#if defined(_WIN32) && !defined(__CYGWIN__)
#define
mkdir(path,mode) mkdir(path)
#define link(one,two) (-1)
#endif
涓婅堪涓や釜鏂囦歡淇濆瓨鍚? configure, make, make install鍗沖彲.
鐢ㄨ繖縐嶆柟寮忛櫎浜哾oc涓嬬殑texi鏂囦歡娌℃硶緙栬瘧鎴愬姛, 鍏朵粬閮芥病鏈夐棶棰? 緙栬瘧鍒癲oc鐨勬椂鍊? 鐩存帴C-c緇撴潫鍗沖彲.
榪欑瘒鏂囩珷鍩烘湰涓婃槸鎽樿嚜gdb鎵嬪唽錛岄櫎姝や箣澶栧氨鏄姞浜嗗疄闄呯殑浠g爜鏍蜂緥錛岃繖鏍峰彲浠ユ洿娓呮鐨勭湅鍒頒竴浜涘懡浠ょ殑鎵ц鏁堟灉銆傚綋鐒訛紝榪欏効涓嶄細娑夊強鍒版墍鏈夌殑gdb鍛戒護錛岃屽彧鏄竴浜涘父鐢ㄧ殑銆?/p>
鎴戣繖鍎夸嬌鐢ㄧ殑gdb鐨勭増鏈槸6.8銆備笉榪囧洜涓哄彧鏄竴浜涘父鐢ㄥ懡浠わ紝鍥犳鍦ㄨ佺増鏈笂搴旇涔熸病闂銆傛搷浣滅郴緇熸槸Windows XP銆?/p>
璋冭瘯鍣ㄧ殑鐩殑鍦ㄤ簬璁╀綘鏌ョ湅紼嬪簭榪愯鏃剁殑鍐呴儴鐘舵侊紱鎴栬呭湪紼嬪簭宕╂簝鐨勬椂鍊欙紝鏌ョ湅紼嬪簭寮傚父鐨勫師鍥犮傚畠浠彲浠ュ湪涓涓嬪嚑涓柟闈㈡彁渚涘府鍔╋細
1)鍚姩紼嬪簭錛屾寜鐓т綘鐨勬剰鎰垮獎鍝嶇▼搴忕殑琛屼負
2)璁╃▼搴忓湪鐗瑰畾鏉′歡鍙戠敓鏃跺仠姝㈣繍琛?/p>
3)褰撶▼搴忓仠姝㈢殑鏃跺欙紝媯鏌ョ▼搴忔鍦ㄥ仛浠涔?/p>
4)鏀瑰彉紼嬪簭鐨勬煇浜涗笢瑗匡紝榪欐牱灝卞彲浠ヨ繍琛屾椂淇bug錛岀劧鍚庣戶緇祴璇曞叾浠栫殑闂銆?/p>
gdb鏀寔澶氱璇█鐨勮皟璇曪紝涓嶈繃鏈鎴愮啛鐨勫簲璇ュ氨鏄痗/c++浜嗐傝繖鍎夸篃浠++紼嬪簭涓轟緥鏉ヨ鏄庛傚鏋滄兂鐭ラ亾鍏朵粬璇█鐨勬敮鎸佹儏鍐碉紝鍙互鐪媑db鎵嬪唽銆?/p>
gdb鏈甯哥敤鐨勫惎鍔ㄦ柟寮忓氨鏄細
gdb program
鎴栬呭湪紼嬪簭寮傚父緇堟鐨勬椂鍊欒繖鏍鳳細
gdb program core
涔熸垨鑰咃紝浣犲彲浠ttach鍒頒竴涓凡緇忚繍琛岀殑榪涚▼鏉ヨ皟璇曞畠錛屽氨鍍忚繖鏍?
gdb program PID
褰撶劧錛屼篃鍙互鍦ㄥ懡浠よ璁劇疆gdb鐨勫惎鍔ㄥ弬鏁幫紝渚嬪args錛?
gdb 鈥攁rgs gcc -O2 -c foo.c
榪欐牱灝卞彲浠ヨ皟璇昰cc錛屽悓鏃跺皢鍙傛暟"-O2 -c foo.c"浼犵粰gcc銆?/p>
鍙互鐢╣db -help鏌ョ湅gdb鐨勬墍鏈夐夐」銆?/p>
瑕佹兂涓gdb鐨勮繍琛岋紝鍙互杈撳叆quit鎴栬卶錛屼篃鍙互鎸塩trl-d緇勫悎閿?/p>
gdb鍛戒護鐨勫艦寮忎負錛歝ommand [arg1...argn]銆傛瘡涓懡浠ゅ崟鐙竴琛屻傝鐨勯暱搴︽病鏈夐檺鍒訛紙褰撶劧錛屼竴鑸簲璇ヤ篃涓嶄細鏈夊闀匡級銆?/p>
璁稿gdb鐨勫懡浠ら兘浼氭湁緙╁啓鐨勫艦寮忥紝渚嬪break鍙互緙╁啓涓篵銆?/p>
濡傛灉鐩存帴鎸夊洖杞︼紝gdb浼氭墽琛屽垰鍒氳鎵ц鍛戒護銆?/p>
濡傛灉鍛戒護涓湁#瀛楃錛岄偅涔堜粠#寮濮嬬殑瀛楃閮戒細琚綋鎴愭槸娉ㄩ噴銆傝繖涓竴鑸敤鍦ㄥ懡浠ゆ枃浠朵腑銆傚悗闈細鏈変粙緇嶃?/p>
gdb鍏鋒湁琛ュ叏鍔熻兘銆傚姛鑳介敭鏄?lt;TAB>銆備緥濡俠reak錛屽湪杈撳叆bre涔嬪悗鎸?lt;TAB> 閿紝gdb灝變細琛ュ叏涓篵reak銆傚鏋滃彧杈撳叆b錛岀劧鍚庢寜<TAB>錛実db浼氬搷涓澹幫紝榪欒鏄庢湁澶氫釜浠寮濮嬬殑鍛戒護銆傝繖縐嶆儏鍐典笅鍐嶆寜涓 嬈?lt;TAB>錛実db灝變細鎶婃墍鏈変互b寮濮嬬殑鍛戒護杈撳嚭鍑烘潵銆備笅闈㈡槸姝ゆ椂鐨勫睆騫曟埅鍥撅細
濡傛灉鍙槸鎯崇湅涓涓嬩互鏌愪釜(浜?瀛楃寮濮嬬殑鍛戒護錛屽彲浠ユ寜<META>?錛岃屼笉鐢ㄦ寜涓ゆ<TAB>銆傚湪娌? 鏈?lt;META>閿殑鐢佃剳涓婏紝鍙互鐢?lt;ESC>閿唬鏇褲傝繖涓懡浠ゆ寜璧鋒潵鏈夌偣楹葷儲錛屾瘮鎸変袱嬈?lt;TAB>瑕侀夯鐑﹀浜嗭紝濡傛灉 涓嶆?lt;TAB>閿鎸夊潖錛屾垜寤鴻浣犺繕鏄寜<TAB>鍚с?/p>
鍛戒護琛ュ叏鍙互鐢ㄤ簬gdb鍛戒護錛実db瀛愬懡浠わ紝紼嬪簭涓殑絎﹀彿鍚嶏紙渚嬪鍑芥暟鍚嶇瓑錛夈?/p>
鍦ㄨ皟璇昪++紼嬪簭鏃訛紝鍩烘湰涓婅偗瀹氫細閬囧埌鐨勯棶棰樺氨鏄噸杞藉嚱鏁般備緥濡傦紝鍦ㄨ緗柇鐐圭殑鏃跺欙紝鍋囪鏈変袱涓悕涓簅verload鐨勫嚱鏁幫紝榪欐椂涓轟簡鍖哄垎鍒板簳鏄偅 涓嚱鏁幫紝灝遍渶瑕佸姞涓婂嚱鏁板弬鏁扮被鍨嬶紙鍑芥暟鍚嶅姞涓婂弬鏁板垪琛ㄤ綔涓洪昏緫涓婄殑涓涓瘝錛夈備負浜嗕嬌gdb鑳藉皢鍙傛暟鍒楄〃涓よ竟鐨勬嫭鍙蜂綔涓鴻繖涓瘝鐨勪竴閮ㄥ垎錛岄渶瑕佺敤鍗曞紩鍙?灝嗗嚱 鏁版暣涓殑鎷搗鏉ャ傜湅涓嬪浘錛?/p>
鍚姩gdb鍚庯紝鍙互杈撳叆鍛戒護help寰楀埌gdb鐨勫懡浠ゅ垪琛ㄣ傛敞鎰忕殑鏄繖鏃惰緭鍑虹殑姣忎釜鏉$洰閮芥槸涓綾誨懡浠ゃ備笂涓浘錛?
寰楀埌鍛戒護綾誨埆鍚庯紝鍙互鐢ㄥ懡浠?help class寰楀埌姝ょ被鍒殑鎵鏈夊懡浠ゃ備笂鍥撅細
涓婇潰鐨勫浘涓彧鏄劇ず浜嗛儴鍒哹reakpoints鍛戒護銆?/p>
鍏朵粬璺熷府鍔╃浉鍏崇殑鍛戒護鏈夛細
a)help command
鐢ㄤ簬鏄劇ず鍛戒護command鐨勫府鍔╀俊鎭?/p>
b)apropos args
榪欓噷鐨刟rgs鍙互浣挎鍒欒〃杈懼紡銆傛樉紺烘墍鏈夊尮閰峚rgs鐨勫懡浠ょ殑綆瑕佽鏄庛?/p>
c)complete args
鏄劇ず鎵鏈変互args寮濮嬬殑鍛戒護銆?/p>
鍙﹀榪樻湁涓や釜寰堟湁鐢ㄧ殑鍛戒護錛?info 鍜?show 銆?/p>
a)info
鐢ㄤ簬鏄劇ず琚皟璇曠▼搴忕殑淇℃伅銆備緥濡備紶閫掑埌褰撳墠鍑芥暟鐨勫弬鏁?info args;鎴栬呮煡鐪嬪綋鍓嶅瘎瀛樺櫒鐨勫?info registers;涔熷彲浠ユ煡鐪嬫柇鐐?info breakpoints銆傚彲浠ョ敤help info鏌ョ湅info鐨勮鏄庛?/p>
b)show
榪欎釜鍛戒護鐢ㄤ簬鏄劇ずgdb鐨勪俊鎭備篃灝辨槸gdb鐨勪竴浜涘睘鎬у箋傚彲浠ョ敤help show鏌ョ湅甯姪淇℃伅銆傝繖涓懡浠ら氬父搴旇鏄厤鍚坰et鐢ㄧ殑錛堢敤浜庤瀹歡db鐨勫睘鎬э級銆?/p>
濂戒簡錛岀幇鍦ㄥgdb搴旇鏈変釜澶ф鐨勮璇嗕簡錛屼笅闈㈡垜浠氨瑕佹嬁鍑犱釜灝忎緥瀛愭潵楠岃瘉涓浜涘父鐢ㄥ懡浠ょ殑鏁堟灉銆侺et's go!
棣栧厛璇存槑涓鐐癸紝瑕佹兂楂樻晥鐨勪嬌鐢╣db鐨勫姛鑳斤紝闇瑕佸湪緙栬瘧紼嬪簭鐨勬椂鍊欒鍔犱笂-g閫夐」錛岃繖涓夐」浼氭妸璋冭瘯淇℃伅鍔犲埌鍙墽琛屾枃浠朵腑銆?/p>
涓嬮潰璇翠竴涓嬬ず渚嬫枃浠訛紝鍖呮嫭涓変釜錛歡db.h錛?gdb.cpp錛?test.cpp
gdb.h#ifndef _GDB_Hgdb.cpp
#define _GDB_H 1
class gdb
{
public:
explicit gdb(int v);
void overload(int one);
void overload(int one, int two);
void catch_ex(int ex); //exception
void loop();
private:
int value;
int array[10];
};
#endif
#include "gdb.h"test.cpp
#include <iostream>
using namespace std;
gdb::gdb(int v)
{
value = v;
for(int i=0; i<10; i++)
{
array[i] = i;
}
}
void gdb::overload(int one)
{
cout<<"function overload with one parameter: "<<one<<endl;
}
void gdb::overload(int one, int two)
{
cout<<"function overload with two paremeters: "<<one<<" "<<two<<endl;
}
void gdb::loop()
{
int loop_array[10];
for(int i=0; i<10; i++)
{
loop_array[i] = i;
}
int v=3;
v=3;
v=4;
}
void gdb::catch_ex(int ex)
{
int e = ex;
try
{
if(e <= 0)
{
throw e;
}
else
{
cout<<"function catch_ex: "<<ex<<endl;
}
}
catch(int x)
{
cout<<"exception: "<<x<<endl;
}
}
#include "gdb.h"
int main()
{
gdb g(5);
g.overload(1);
g.overload(1, 2);
g.loop();
g.catch_ex(3);
g.catch_ex(-1);
return 0;
}
濂戒簡錛岀幇鍦ㄥ紑濮嬭皟璇曘傞鍏堝惎鍔╣db錛屾寚瀹氳璋冭瘯鐨勫彲鎵ц鏂囦歡銆傚墠闈㈠凡緇忚榪囦簡錛屽彲浠ョ畝鍗曞湴浣跨敤gdb program鏉ュ惎鍔ㄣ傛垨鑰呭彲浠ラ鍏堝惎鍔╣db錛岀劧鍚庣敤file鍛戒護鎸囧畾瑕佽皟璇曠殑鏂囦歡銆備笅闈㈡槸浠呭惎鍔╣db鍚庣殑鐢婚潰錛?
鐜板湪鐢╢ile鍛戒護鎸囧畾瑕佽皟璇曠殑鏂囦歡錛?/p>
鐒跺悗灝卞彲浠ョ敤 run 鎴栬?r 鍛戒護鏉ヨ繍琛岀▼搴忋傚湪榪愯涔嬪墠錛屼綘鍙兘闇瑕佷負紼嬪簭璁懼畾涓浜涗俊鎭紝榪欎簺淇℃伅鏈変竴涓嬪洓縐嶏細
1)紼嬪簭鍙傛暟
鍙互鐢╯et args鍛戒護璁懼畾紼嬪簭鐨勫弬鏁般傝瀹氬畬鍚庡彲浠ョ敤show args鏌ョ湅璁劇疆鐨勬槸鍚︽紜傚鏋渟et args鍚庨潰涓嶅甫浠諱綍鍙傛暟錛屽垯鍚戠▼搴忎紶閫掔殑鍙傛暟涓虹┖銆?/p>
2)鐜
榪欏効鐨勭幆澧冨氨鏄湪緋葷粺/鐢ㄦ埛閰嶇疆鏂囦歡涓緗殑鐜鍙橀噺,鍍廐OME, PATH涔嬬被鐨?GDB鎻愪緵浜嗗湪璋冭瘯鐨勬椂鍊欐敼鍙樿繖浜涘彉閲忓肩殑鏂瑰紡,榪欐牱褰撻渶瑕佺殑鏃跺欏氨涓嶇敤閫鍑篻db鏉ラ噸鏂拌緗?GDB鎻愪緵鐨勫懡浠ゆ湁:
a) path directory 錛嶏紞 灝?directory 鍔犲埌鐜鍙橀噺PATH鍓嶉潰. 娉ㄦ剰 瀵筆ATH鐨勬敼鍙樺彧瀵硅皟璇曠殑紼嬪簭鏈夋晥, GDB浣跨敤鐨凱ATH涓嶄細鏈夋敼鍙?1
b) show paths 錛嶏紞 鏄劇ずPATH鐨勫箋?/p>
c) show environment [varname] 錛嶏紞 鏄劇ず鐜鍙橀噺varname鐨勫鹼紝濡傛灉涓嶆寚瀹歷arname錛屽垯鏄劇ず鎵鏈夌幆澧冨彉閲忕殑鍊箋?/p>
d) set environment varname [= value] 錛嶏紞 璁劇疆鐜鍙橀噺varname鐨勫間負value銆傝繖涓敼鍙樺彧鏄璋冭瘯鐨勭▼搴忕敓鏁堛傚鏋滀笉鎻愪緵value錛屽垯灝唙arname鐨勫肩疆涓虹┖銆?/p>
e) unset environment varname 錛嶏紞 浠庣幆澧冧腑縐婚櫎浼犻掔粰紼嬪簭鐨勫彉閲弙arname銆?/p>
3)宸ヤ綔鐩綍
鍦ㄥ惎鍔╣db璋冭瘯紼嬪簭鐨勬椂鍊欙紝琚皟璇曠殑紼嬪簭浼氫粠gdb緇ф壙宸ヤ綔鐩綍銆傚綋鐒秅db涔熸彁渚涗簡鍛戒護鏉ヤ慨鏀瑰伐浣滅洰褰曪細
a) cd directory 錛嶏紞 灝?directory 璁句負鏂扮殑宸ヤ綔鐩綍銆?/p>
b) pwd 錛嶏紞 鏄劇ず褰撳墠宸ヤ綔鐩綍銆?/p>
4)鏍囧噯杈撳叆杈撳嚭
榪樻病鎵懼埌鍦╳indows閲岄潰榪欎釜涓滆タ鏈夊暐鐢紝鐜板湪涔熸病鏈塴inux鍙敤錛屼笉濂藉璇淬傛湁闇瑕佺殑鑷繁鐪媑db鎵嬪唽鍚с傛垜綆鍗曟妱涓涓嬫墜鍐屽惂銆?/p>
鍦╣db涓紝鍙互灝唕un鍛戒護鐨勮緭鍏ヨ緭鍑洪噸瀹氬悜鍒版枃浠舵垨鑰呭叾浠栫粓绔備篃鍙互閫氳繃tty鍛戒護璁劇疆琚皟璇曠▼搴忚緭鍏ヨ緭鍑虹殑璁懼銆傚懡浠ゆ牸寮忔槸錛?/p>
tty terminal 鎴栬?set inferior-tty terminal.
tty 灝辨槸 set inferior-tty 鐨勫埆鍚嶃?/p>
鍜氬挌鍜氬挌錛屼笅闈㈡寮忓紑濮嬶紒
涓婇潰鎴戜滑宸茬粡鍚姩浜嗙▼搴? 涔熺煡閬撲簡濡備綍榪愯紼嬪簭銆傚彲鏄鏋滀綘鐩存帴鎵цrun鍛戒護浼氬彂鐜幫紝紼嬪簭鐩存帴榪愯緇撴潫浜嗐傚鏋滀綘鎯沖湪鏌愪竴琛屾垨鑰呮煇涓嚱鏁拌皟鐢ㄧ殑鍦版柟錛屾垨鑰呭綋鏌愪釜鍙橀噺/琛ㄨ揪寮忕殑鍊兼敼鍙樼殑鏃跺欙紝涔熸垨鑰呭湪鏌愪簺浜嬩歡鍙戠敓鐨勬椂鍊欙紞錛嶄緥濡傛姏鍑哄紓甯搞佸姞杞藉姩鎬佸簱錛屾垨鑰呭垱寤哄瓙榪涚▼錛嶏紞鐨勬椂鍊欏仠姝㈢▼搴忚繍琛岋紝閭e簲璇ユ庝箞鍔炲憿錛?/p>
鏈変簡gdb錛屼竴鍒囧氨閮藉ソ鍔炰簡:), 鍒╃敤涓嬮潰榪欎笁涓己澶х殑姝﹀櫒錛屼綘鍙互浠繪剰鐨勫仠姝㈢▼搴忋傚皬蹇冧簡錛屽ぇ瀹跺皬蹇冧簡錛屽伓瑕佺キ鍑鴻繖涓変歡瀹濈墿浜嗭紝瀹冧滑鏄細
鏂偣灝辨槸鎸囧畾涓涓綅緗紝浣垮緱紼嬪簭榪愯鍒拌繖涓綅緗殑鏃跺欎細鍋滀笅鏉ワ紙褰撶劧錛岃繕鍙互璁劇疆鏉′歡鏂偣錛屽綋榪愯鍒版寚瀹氫綅緗椂錛屽彧鏈夋弧瓚充簡璁劇疆鐨勬潯浠訛紝紼嬪簭鎵嶄細鍋滀笅鏉ワ級錛岃繖鏍蜂究浜庤瀵熺▼搴忕殑鍐呴儴鐘舵併傛柇鐐圭浉鍏崇殑鍛戒護涓昏鏈夛細
a)break location
鍦ㄦ寚瀹氫綅緗?location 澶勮緗柇鐐癸紝榪欓噷鐨?location 鍙互鏄嚱鏁板悕錛岃鍙鳳紝鎸囦護鍦板潃絳夛紙鍏充簬濡備綍鎸囧畾 location ,鍙互鐪?a href="http://www.shnenglu.com/lucency/archive/2008/08/18/59214.html#location">榪欓噷錛夈?/p>
b)break
濡傛灉涓嶆寚瀹氫換浣曞弬鏁幫紝break浼氬湪閫夊畾鐨?a href="http://www.shnenglu.com/lucency/archive/2008/08/18/59214.html#stack">鏍堝撫鐨勪笅涓鏉℃寚浠ゅ璁劇疆鏂偣銆?/p>
c)break ... if cond
璁劇疆鏉′歡鏂偣銆傛瘡嬈″埌杈炬柇鐐圭殑鏃跺欓兘浼氬琛ㄨ揪寮?cond 姹傚鹼紝鍙湁褰撶粨鏋滀負闈?鐨勬椂鍊欑▼搴忔墠浼氬湪榪欎釜鏂偣鍋滀笅鏉ャ?/p>
d)tbreak args
璁劇疆涓涓彧鐢熸晥涓嬈$殑鏂偣銆俛rgs璺焍reak鍛戒護閲岀殑鍙傛暟鎰忎箟鐩稿悓錛堜篃灝辨槸璇達紝鍙互涓簂ocation錛屼負絀猴紝鎴栬呮潯浠訛級銆?/p>
e)hbreak args
璁劇疆紜歡鏂偣銆?/p>
f)thbreak args
璁劇疆鍙敓鏁堜竴嬈$殑紜歡鏂偣銆?/p>
g)rbreak regex
鍦ㄦ墍鏈夊尮閰嶆鍒欒〃杈懼紡 regex 鐨勫嚱鏁頒笂璁劇疆鏂偣銆?/p>
h)info breakpoints [n]
i)info break [n]
j)info watchpoints [n]
涓婇潰涓変釜鍛戒護閮芥槸鍒楀嚭褰撳墠鐨勬柇鐐廣佽瀵熺偣鍜屾崟鎹夌偣錛屽鏋滄寚瀹氬弬鏁皀錛屽垯浠呭垪鍑虹n涓殑淇℃伅銆?/p>
鏉ヨ瘯楠屼竴鎶婂惂銆傞鍏堢敤gdb鍚姩紼嬪簭錛屽亣璁炬垜浠兂鍦╰est.cpp鐨?g.overload(1) 榪欎竴琛屾坊鍔犱竴涓柇鐐癸紝閭e氨鎵ц鍛戒護錛歜 test.cpp:6,鎵ц瀹屽悗錛?/p>
榪欐椂鍙互鐢╥nfo break絳夊懡浠ゆ煡鐪嬫柇鐐逛俊鎭細
鐒跺悗鎴戜滑榪愯紼嬪簭錛岀湅鐪嬫湁浠涔堟晥鏋溿?/p>
鐪嬪埌浜嗗惂錛岀▼搴忓仠鍦ㄤ簡鏂偣鎵鍦ㄧ殑琛屻傝繖鏃跺彲浠ョ敤where鎴栬協rame鏌ョ湅褰撳墠鐨勬爤甯т俊鎭紝涔熷彲浠ョ敤 print 鏌ョ湅涓浜涘彉閲忔垨鑰呰〃杈懼紡鐨勪俊鎭紝鎴栬卛nfo args鏌ョ湅鍙傛暟淇℃伅錛岀瓑絳夈?/p>
鍏朵粬鐨勫懡浠ゅぇ瀹跺彲浠ヨ嚜宸卞皾璇曚竴涓嬨?/p>
鏈夋椂鍊欐垜浠茍涓嶇‘瀹氳鍦ㄥ摢閲屽姞鏂偣錛屼緥濡傚綋鎴戜滑鎯沖湪鏌愪釜鍙橀噺琚敼鍙樻垨鑰呰璇匯佽鍐欑殑鏃跺欒紼嬪簭鍋滀笅鏉ワ紝鍙兘鐢變簬璁塊棶鍙橀噺鐨勫湴鏂規瘮杈冨錛岃鎯蟲瘡涓湴鏂歸兘鍔犱笂鏂偣姣旇緝楹葷儲錛岃屼笖寰堝彲鑳芥湁閬楁紡錛岃繖鏃跺欐垜浠氨闇瑕佷緷璧栧彟涓涓己澶х殑鍛戒護浜嗭紝涔熷氨鏄瀵熺偣銆?/p>
瑙傚療鐐規槸涓綾葷壒孌婄殑鏂偣錛屽鏋滈拡瀵規煇涓彉閲忔垨鑰呰〃杈懼紡鎸囧畾涓涓瀵熺偣錛岄偅涔堝綋瀹冧滑鐨勫艱璇?鍐欑殑鏃跺欙紝gdb浼氬仠姝㈢▼搴忕殑鎵ц銆備綘涓嶉渶瑕佸儚璁劇疆鏂偣鏃墮偅鏍鋒槑紜寚瀹氳繖涓瀵熺偣鍦ㄧ▼搴忎腑鐨勪綅緗傝瀵熺偣鐩稿叧鐨勫懡浠ゆ湁錛?/p>
a)watch expr [thread threadnum]
瀵?expr 璁劇疆涓涓瀵熺偣銆傚綋 expr 鐨勫艱鏀瑰彉鐨勬椂鍊欙紝gdb浼氬仠姝㈢▼搴忕殑榪愯銆?/p>
濡傛灉鎸囧畾浜嗙嚎紼嬪弬鏁皌hread threadnum 錛屽垯 鍙湁 鍦ㄧ嚎紼?threadnum 鏀瑰彉 expr 鐨勫兼椂錛岀▼搴忔墠浼氬仠姝€?/p>
b)rwatch expr [thread threadnum]
瀵?expr 璁劇疆涓涓瑙傚療鐐廣傚綋紼嬪簭璇?expr 鐨勫兼椂錛実db浼氬仠姝㈢▼搴忕殑榪愯銆?/p>
c)awatch expr [thread threadnum]
瀵?expr 璁劇疆涓涓闂瀵熺偣銆傚綋紼嬪簭璇繪垨鑰呭啓 expr 鏃訛紝gdb浼氬仠姝㈢▼搴忕殑榪愯銆?/p>
d)info watchpoints
鏄劇ず鎵鏈夌殑鏂偣銆佽瀵熺偣銆佹崟鎹夌偣銆傝窡info break 鐩稿悓銆?/p>
涓嬮潰鍐嶆潵鐪嬬湅瑙傚療鐐圭殑浣跨敤銆?/p>
棣栧厛鎴戜滑璁劇疆涓涓柇鐐瑰湪g.loop()榪欎竴琛岋紝鐒跺悗榪愯鍒拌繖閲屻俿tep榪涘叆loop()鍑芥暟銆傝繖涓涓插懡浠ょ殑鎵ц濡備笅錛?/p>
榪欐椂鎴戜滑宸茬粡榪涘叆loop()鍑芥暟錛岀幇鍦ㄦ垜浠緗嚑涓瀵熺偣銆傝緗懡浠ゅ簭鍒楀拰璁劇疆瀹屽悗鐨勬晥鏋滃灝忥細
鍙互鐪嬪埌鏈?涓仠姝㈢偣錛屽叾涓墠涓や釜鏄垜浠緗殑鏂偣錛屽悗闈笁涓槸瑙傚療鐐廣傚垎鍒負watch, rwatch 鍜?awatch銆傚彟澶栬繕鏈変竴涓湴鏂瑰氨鏄紝x86涓婇粯璁ゆ槸紜歡瑙傚療鐐廣?/p>
濂戒簡錛屾潵榪愯涓涓嬭瘯璇曘?/p>
鍒拌揪絎竴涓瀵熺偣鐨勬椂鍊欑▼搴忓仠姝㈣繍琛岋紝鍚屾椂鎵撳嵃鍑轟簡鍙橀噺鐨勬棫鍊煎拰鏂板鹼紝浠ュ強瑙傚療鐐圭殑浣嶇疆銆?/p>
涓嬮潰鎴戜滑鎺ョ潃榪愯錛岀湅鐪嬮亣鍒板悗闈㈢殑瑙傚療鐐圭殑鏃跺欏張浼氭庢牱銆?/p>
紼嬪簭鍦ㄧ涓変釜瑙傚療鐐瑰仠浜嗕笅鏉ワ紙絎簩涓瀵熺偣涓鴻瑙傚療鐐癸級錛屽悓鏍鋒墦鍗板嚭浜嗗彉閲忕殑鏂版棫鍊煎拰瑙傚療鐐圭殑浣嶇疆銆傜浜屼釜瑙傚療鐐圭敱浜庢槸璇昏瀵熺偣錛岃岀▼搴忎腑娌℃湁璇昏繖涓彉閲忕殑鍦版柟錛屽洜姝よ繍琛岀殑鏃跺欒璺寵繃浜嗐備負浜嗙湅涓涓嬭瑙傚療鐐圭殑鏁堟灉錛屾垜浠啀璁劇疆涓涓瑙傚療鐐癸細
i鏄驚鐜唴鐨勮凱浠e櫒錛屽畠浼氳澶嶅埗緇檒oop_array[i]鍙橀噺錛屼篃灝辨槸浼氳璇匯傚彲浠ョ湅鍒幫紝紼嬪簭浼氬仠姝㈣繍琛岋紝杈撳嚭i鐨勫箋傛敞鎰忥細姣忔瀵筰鐨勮鎿嶄綔閮戒細浣垮緱紼嬪簭鍋滄銆備笅闈㈡槸涓ゆ鎵цcontinue鍛戒護鍚庣殑杈撳嚭錛?/p>
瑙傚療鐐圭殑鍐呭宸笉澶氬氨榪欎簺浜嗐傚彟澶栨湁涓渶瑕佹敞鎰忕殑鍦版柟灝辨槸: watch鍛戒護璁劇疆鐨勮瀵熺偣鍙湁鍦ㄥ彉閲忔垨鑰呰〃杈懼紡鐨勫艱鏀瑰彉寰楁椂鍊欐墠浼氫嬌寰楃▼搴忓仠姝㈣繍琛岋紝濡傛灉鍙槸琚啓錛屼絾鏄兼病鏈夋敼鍙橈紝鍒欑▼搴忎笉浼氬仠姝€?/strong>
涓婇潰宸茬粡璁蹭簡鏂偣銆佽瀵熺偣錛岃屽浜庢煇浜涙儏鍐碉紝榪欎袱縐嶅仠姝㈢偣騫朵笉鏄渶鏈夋晥鐨勬柟寮忋備緥濡傛兂鍦╟++紼嬪簭涓窇鍑哄紓甯哥殑鏃跺欏仠 姝㈢▼搴忥紝榪欐椂鍊欑敤鏂偣灝變笉澶熸湁鏁堜簡錛屽洜涓虹▼搴忎腑鍙兘濂藉寮傚父澶勭悊鐨勫湴鏂癸紝濡傛灉涓涓釜璁劇疆鏂偣錛岄偅灝卞お楹葷儲浜嗭紙褰撶劧濡傛灉鍙鐞嗘煇鍑犱釜寮傚父錛岀敤鏂偣涔熸棤涓嶅彲錛? 鐢氳嚦鐢ㄨ搗鏉ユ洿鐏墊椿錛夛紱鑰岃瀵熺偣灝辨洿涓嶅彲鐢ㄤ簡銆?/p>
榪欑鎯呭喌灝遍渶瑕佺敤鍒版崟鎹夌偣浜嗐?/p>
鎹曟崏鐐逛篃鏄竴綾葷壒孌婄殑鏂偣錛屽畠鍙互浣垮緱紼嬪簭鍦ㄦ煇縐嶄簨浠跺彂鐢熸椂鍋滄榪愯錛屼緥濡俢++寮傚父錛屾垨鑰呭姞杞藉姩鎬佸簱銆佸垱寤哄瓙榪涚▼絳夈傝緗崟鎹夌偣鐨勫懡浠ゆ槸catch.
catch event
鍏朵腑 event 鍙互鏄細
a)throw
c++鎶涘嚭寮傚父銆?/p>
b)catch
c++鎹曟崏寮傚父銆?/p>
c)exception
Ada寮傚父銆?/p>
d)exception unhandled
紼嬪簭涓湭澶勭悊鐨勫紓甯搞?/p>
e)assert
澶辮觸鐨凙da鏂█銆?/p>
f)exec
瀵筫xec鐨勮皟鐢紙鍙湪HP-UX鍜孏NU/Linux涓彲鐢級銆?/p>
g)fork
瀵筬ork鐨勮皟鐢紙鍙湪HP-UX鍜孏NU/Linux涓彲鐢級銆?/p>
h)vfork
瀵箆fork鐨勮皟鐢紙鍙湪HP-UX鍜孏NU/Linux涓彲鐢級銆?/p>
i)load
鍔ㄦ佸姞杞藉叡浜簱錛堝彧鍦℉P-UX涓彲鐢級銆?/p>
j)load libname
鍔ㄦ佸姞杞藉叡浜簱 libname 錛堝彧鍦℉P-UX涓彲鐢級銆?/p>
k)unload
鍗歌澆宸插姞杞界殑鍏變韓搴擄紙鍙湪HP-UX涓彲鐢級銆?/p>
l)unload libname
鍗歌澆宸插姞杞界殑鍏變韓搴?libname 錛堝彧鍦℉P-UX涓彲鐢級銆?/p>
榪樻湁涓涓緗彧鐢熸晥涓嬈$殑鎹曟崏鐐圭殑鍛戒護鏄細 tcatch event 銆?/p>
涓嬮潰鍐嶇湅涓涓嬫崟鎹夌偣鐨勪嬌鐢ㄣ?/p>
棣栧厛鍦╲test.cpp鐨?g.catch_ex(-1); 璁劇疆涓涓柇鐐癸紝鐒跺悗榪愯錛岃繘鍏ユ鍑芥暟銆?/p>
鐜板湪鎴戜滑璁劇疆涓涓崟鎹夌偣銆傜戶緇繍琛岋細
鍙互鐪嬪埌紼嬪簭鍦ㄦ姏鍑哄紓甯哥殑鍦版柟鍋滄浜嗐?/p>
褰撴柇鐐逛笉鍐嶉渶瑕佷簡錛岄偅灝卞簲璇ュ垹闄ゆ帀錛屽惁鍒欐瘡嬈℃墽琛屽埌鏂偣鐨勪綅緗▼搴忛兘瑕佸仠涓嬫潵錛屼細鎶婁漢閫肩柉鐨勩傚垹闄ゆ柇鐐圭殑鍛戒護鏈変袱涓細clear鍜宒elete銆?/p>
a)clear [ location ]
濡傛灉涓嶆寚瀹?location 錛屽垯鍒犻櫎閫夋嫨鐨勬爤甯т腑涓嬩竴鏉¤鎵ц鐨勬寚浠や笂鐨勪換浣曟柇鐐廣傚鏋滈夋嫨鐨勬槸鏈鍐呴儴鐨勬爤甯э紙涔熷氨鏄綋鍓嶆鎵ц鐨勫嚱鏁扮殑鏍堝撫錛夛紝鍒檆lear浼氬皢鍒氬垰浣跨▼搴忓仠姝㈢殑鏂偣琚垹闄ゃ? 鍏充簬 location 鐨勮鏄庡彲浠ョ湅榪欓噷銆?/p>
b)delete [breakpoints] [ range ... ]
鍒犻櫎鎸囧畾鑼冨洿 range 閭g殑鎵鏈夌殑鏂偣銆佽瀵熺偣銆佹崟鎹夌偣銆傚鏋滀笉鎸囧畾鍙傛暟 range 錛屽垯浼氬垹闄ゆ墍鏈夌殑鍋滄鐐廣傝繖閲岀殑 range 鎸囧畾鐨勬槸鏂偣緙栧彿鍖洪棿銆傚彲浠ョ敤info break鏌ョ湅鏂偣淇℃伅銆?/p>
濡傛灉涓嶆兂鍒犻櫎鏂偣錛屽彧鏄兂鏆傛椂浣垮畠澶辨晥錛屽垯鍙互浣跨敤disable鍛戒護銆俤isable鍛戒護鐨勫艦寮忓涓嬶細
a)disable [breakpoints] [ range ...]
浣挎寚瀹氬尯闂?range 鍐呯殑鏂偣澶辨晥銆傚鏋滀笉鎸囧畾 range 錛屽垯鎵鏈夌殑鏂偣閮藉け鏁堛?/p>
浣挎柇鐐圭敓鏁堢殑鍛戒護鏄痚nable錛屽艦寮忔湁錛?/p>
a)enable [breakpoints] [ range ...]
浣挎寚瀹氬尯闂?range 鍐呯殑鏂偣鎴栬呮墍鏈夋柇鐐圭敓鏁堛?/p>
b)enable [breakpoints] once range...
浣挎寚瀹氬尯闂村唴鐨勬柇鐐圭敓鏁堜竴嬈°?/p>
c)enable [breakpoints] delete range...
浣挎寚瀹氬尯闂村唴鐨勬柇鐐圭敓鏁堜竴嬈★紝鐒跺悗鍒犻櫎銆?/p>
鏂偣鏉′歡浣垮緱鍙湁鍦ㄧ浉搴旂殑鏉′歡婊¤凍鏃訛紝鏂偣鎵嶆湁鏁堛傝繖閲岀殑鏉′歡琛ㄨ揪寮忚窡紼嬪簭鎵鐢ㄨ璦鐨勯昏緫琛ㄨ揪寮忕殑璇硶鐩稿悓錛屼緥濡傚湪c/c++璇█閲岋紝鍙互鐢?a==b 鎴栬?x&&y榪欑琛ㄨ揪寮忋?/p>
鏂偣鏉′歡鍙互鍦ㄨ緗柇鐐圭殑鏃跺欐寚瀹氾紝涔熷彲浠ュ湪鏂偣璁劇疆鍚庨氳繃condition鍛戒護鏉ヨ緗垨鑰呮敼鍙樸?condition鐨勫艦寮忎負錛?/p>
a)condition bnum expression
璁劇疆琛ㄨ揪寮?expression 涓哄仠姝㈢偣 bnum 鐨勬潯浠躲?/p>
b)condition bnum
鍒犻櫎鍋滄鐐?bnum 鐨勬潯浠躲?/p>
榪樻湁涓涓懡浠わ紝鍙互浣垮緱gdb蹇界暐鏂偣鐨勬潯浠朵竴瀹氱殑嬈℃暟錛屽叾褰㈠紡涓猴細
a)ingore bnum count
璁稿gdb鍛戒護閮芥帴鍙椾竴涓敤浜庢寚瀹氱▼搴忎綅緗殑鍙傛暟銆備綅緗殑鎸囧畾鏂瑰紡鏈変笅闈㈠嚑縐嶏細
a) linenum
褰撳墠婧愭枃浠剁殑琛屽彿銆?/p>
b) -offset
褰撳墠琛屽墠闈紝璺熷綋鍓嶈闂撮殧涓?offset 鐨勮銆傚綋鍓嶈鍙互榪欐牱紜畾錛氫嬌鐢╨ist鍛戒護錛屾墦鍗板嚭鏉ョ殑鏈鍚庝竴琛屽氨鏄綋鍓嶈錛涙垨鑰呭浜庢柇鐐瑰懡浠わ紝閫夊畾鐨勬爤甯т腑錛岀▼搴忓仠姝㈡墽琛岀殑浣嶇疆灝辨槸褰撳墠琛屻?/p>
c) +offset
褰撳墠琛屽悗闈紝璺熷綋鍓嶈闂撮殧涓?offset 鐨勮銆?/p>
d) filename:linenum
婧愭枃浠?filename 涓殑琛?linenum銆?/p>
e) function
褰撳墠婧愭枃浠朵腑鐨勫嚱鏁?function銆?/p>
f) filename:function
婧愭枃浠?filename 涓殑鍑芥暟 function銆?/p>
g) * address
鎸囧畾紼嬪簭鍦板潃 address銆傚父鐢ㄧ殑 address 褰㈠紡鏈夛細
expression 錛嶏紞 褰撳墠璇█涓湁鏁堢殑琛ㄨ揪寮忋?/p>
funcaddr 錛嶏紞 鍑芥暟鐨勫湴鍧銆傚湪c/c++涓氨鏄嚱鏁板悕銆?/p>
'filename'::funcaddr 錛嶏紞 婧愭枃浠?filename 涓殑鍑芥暟鍦板潃 funcaddr銆?/p>
鍚庨潰鎳掑緱鍐欎簡錛屾殏鏃跺厛鏀句竴鏀俱傚彂鐜板氨綆楁槸鎶勬枃妗o紝鍐呭澶氫簡涔熸槸涓緢绱漢鐨勬椿銆傚攭錛屾噿浜嗭紝涓嶈浜?..
寰呮坊鍔?/p>
寰呮坊鍔?/p>
寰呮坊鍔?/p>
榪欑瘒鏂囩珷鍙槸鎹′簡GDB涓渶甯哥敤鐨勪竴浜涗笢瑗匡紝鑰屼笖榪樺彧鏄渶甯哥敤鐨勪笢瑗夸腑鐨勪竴灝忛儴鍒嗭紝鏈夊叴瓚f垨鑰呴渶瑕佺殑鍙互鐩存帴鐪婫DB鐨勬枃妗o紝鍙互鍦?a >榪欓噷鎵懼埌銆?/p>
1. 涓嶇煡閬撴槸涓嶆槸鍥犱負windows鍜宭inux緋葷粺鐨勪笉鍚岋紝鐢╣db鍚姩紼嬪簭鍚庯紝鎵цshow paths鍚庤緭鍑猴細Executables and object file path: 銆備篃灝辨槸璇磋緭鍑虹殑鍊兼槸絀虹殑銆?/p>
The big cat ate the small catfish
瀛樺湪(涓ゆ),浣嗘槸涓嶅湪瀛楃涓睸2 = Dogs for sale涓?涓鐩磋寰梥ource insight涓樉紺哄彉閲忓拰鍑芥暟瀹氫箟鐨刢ontext window寰堝ソ,鏄ㄥぉ紿佺劧鍙戠幇鍘熸潵ecb(Emacs Code Browser)涓篃鏈変釜綾諱技鐨勪笢瑗?褰搇ayout鎹㈡垚left_symboldef鍚?宸︿笅紿楀彛灝辨槸浜?鍟ヤ篃涓嶈浜?璐翠釜鍥懼惂.
榪欎釜鏄垜鏍規嵁鍘熷厛鐨刲ayout
left_symboldef鏀圭殑.鍙互鐪嬪埌宸﹁竟閭d竴鏍?涓婇潰鏄嚱鏁板暐鐨勫垪琛?涓嬮潰灝辨槸絎﹀彿瀹氫箟紿楀彛.鏈変袱鐐逛笉鐖界殑鏄鍙峰畾涔夌獥鍙f病娉曞崟鐙斁鍦ㄤ笅闈?涓昏鏄斁鍦ㄥ乏杈圭殑璇?鍑芥暟鍘熷瀷姣旇緝闀跨殑灝辨病娉曞畬鏁存樉紺?浜屾槸涓嶈兘鍍弒i閭f牱鍙屽嚮璺寵漿.涓嶈繃涔熶笉閿欎簡,璺寵漿鐢╟scope涔熷鏄?
ps:鎴戠殑ecb鍑芥暟鍒楄〃涓病娉曟樉紺哄弬鏁扮被鍨?鍝綅濡傛灉鐭ラ亾楹葷儲璇翠竴涓嬪搱,璋簡!
0. 搴忔洸
鍐欒繖綃囩煭鏂囩殑璧峰洜鏄?鍓嶄袱澶╂兂鍘誨ぉ澶х殑acm鍦ㄧ嚎緋葷粺鎵懼嚑閬撻鍋氬仛銆備負浠涔堝憿?鍥犱負鏈漢澶╁ぇ姣曚笟,榪欎釜澶╁ぇ鍛㈠彲鏄腑鍥芥渶鏃╃殑澶у,鍘熷悕鍖楁磱澶у鍫?榪欏彲緇濆鏄揣鐪熶環瀹炵殑絎竴鎵澶у銆傜粰澶у鎺ㄨ崘鎺ㄨ崘鍟?瀛﹂閭f槸鐩稿綋鐨勫ソ銆?/p>
鎵浜?榪樻槸鍥炲埌鏈潵鐨勮瘽棰樹笂銆備笂浜哸cm緋葷粺涔嬪悗,灝卞厛鐪嬩簡1001銆傞偅閬撻鐨勬剰鎬濇槸杈撳叆涓浜涙鏁存暟(浠OF緇撴潫),鎶婂搴旂殑瀛楃杈撳嚭銆傝繖涓畝鍗?紼嬪簭寰堝揩灝卞嚭鏉ヤ簡:
#include <stdio.h>
int main()
{
int c;
while(scanf("%d", &c) != EOF)
{
putchar(c);
}
return 0;
}
紼嬪簭榪愯,杈撳叆103 102 105 107<enter>
杈撳嚭gfik銆?/p>
褰撴椂榪愯瀹屼箣鍚庨┈涓婃兂,涓轟粈涔堜笉鏄緭鍏ヤ竴涓暟瀛楅┈涓婅緭鍑轟竴涓瓧絎﹀憿,鍥犱負鐪嬬▼搴忕‘瀹炴槸榪欐牱鐨勯昏緫,鍙涓嶆槸EOF,灝變細杈撳嚭銆傚張涓鎯?瀵逛簡,鏄紦鍐茬殑闂銆傛兂璧鋒潵APUE閲岃竟璇村緱stdin搴旇鏄緙撳啿鐨?鍙﹀,鍙互鐢╯etbuf,setvbuf璁懼畾嫻佺殑緙撳啿銆備簬鏄兂灝唖tdin璁炬垚鏃犵紦鍐茬殑銆備簬鏄▼搴忓彉鎴愯繖鏍?
#include <stdio.h>
int main()
{
int c;
setbuf(stdin, NULL);
while(scanf("%d", &c) != EOF)
{
putchar(c);
}
return 0;
}
鍙槸緙栬瘧榪愯,榪樻槸鑰佹牱瀛?娌℃湁鍙樺寲銆傛兂浜嗘兂,娌℃兂鍑烘槸鍟ュ師鍥?浜庢槸寮濮媑oogle鍜孉PUE銆傜粓浜庣畻鏄槑鐧戒簡浜?鏁寸悊鍦ㄨ繖鍎褲?/p>
澹版槑錛?/p>
鏈枃寰堝ぇ閮ㄥ垎鍐呭鏉ヨ嚜APUE錛嶏紞UNIX鐜楂樼駭緙栫▼銆?/p>
1. 緙撳啿綾誨瀷銆?/p>
鏍囧噯搴撴彁渚涚紦鍐叉槸涓轟簡鍑忓皯瀵箁ead鍜寃rite鐨勮皟鐢ㄣ傛彁渚涚殑緙撳啿鏈変笁縐嶇被鍨?鏁寸悊鑷狝PUE):
鍦ㄨ繖縐嶆儏鍐典笅,瀹為檯鐨処/O鎿嶄綔鍙湁鍦ㄧ紦鍐插尯琚~婊′簡涔嬪悗鎵嶄細榪涜銆傚椹葷暀鍦ㄧ鐩樹笂鐨勬枃浠剁殑鎿嶄綔涓鑸槸鏈夋爣鍑咺/O搴撴彁渚涘叏緙撳啿銆傜紦鍐插尯涓鑸槸鍦ㄧ涓嬈″嫻佽繘琛孖/O鎿嶄綔鏃?鐢辨爣鍑咺/O鍑芥暟璋冪敤malloc鍑芥暟鍒嗛厤寰楀埌鐨勩?/p>
鏈flush鎻忚堪浜嗘爣鍑咺/O緙撳啿鐨勫啓鎿嶄綔銆傜紦鍐插尯鍙互鐢辨爣鍑咺/O鍑芥暟鑷姩flush(渚嬪緙撳啿鍖烘弧鐨勬椂鍊?;鎴栬呮垜浠嫻佽皟鐢╢flush鍑芥暟銆?/p>
鍦ㄨ繖縐嶆儏鍐典笅,鍙湁鍦ㄨ緭鍏?杈撳嚭涓亣鍒版崲琛岀鐨勬椂鍊?鎵嶄細鎵ц瀹為檯鐨処/O鎿嶄綔銆傝繖鍏佽鎴戜滑涓嬈″啓涓涓瓧絎?浣嗘槸鍙湁鍦ㄥ啓瀹屼竴琛屼箣鍚庢墠鍋欼/O鎿嶄綔銆備竴鑸殑,娑夊強鍒扮粓绔殑嫻?-渚嬪鏍囨敞杈撳叆(stdin)鍜屾爣鍑嗚緭鍑?stdout)--鏄緙撳啿鐨勩?/p>
鏍囧噯I/O搴撲笉緙撳瓨瀛楃銆?span style="color: #ff0000;">闇瑕佹敞鎰忕殑鏄?鏍囧噯搴撲笉緙撳瓨騫朵笉鎰忓懗鐫鎿嶄綔緋葷粺鎴栬呰澶囬┍鍔ㄤ笉緙撳瓨銆?br>
ISO C瑕佹眰:
浣嗘槸,榪欏茍娌℃湁鍛婅瘔鎴戜滑褰撴爣鍑嗚緭鍏?杈撳嚭鍦ㄦ秹鍙婁氦浜掕澶囨椂,瀹冧滑鏄棤緙撳瓨鐨勮繕鏄緙撳瓨鐨?涔熸病鏈夊憡璇夋垜浠爣鍑嗛敊璇簲璇ユ槸琛岀紦瀛樼殑榪樻槸鏃犵紦瀛樼殑銆備笉榪?澶у鏁板疄鐜伴粯璁ょ殑緙撳瓨綾誨瀷鏄繖鏍風殑:
2. 鏀瑰彉榛樿緙撳瓨綾誨瀷
鍙互閫氳繃涓嬮潰鐨勫嚱鏁版敼鍙樼紦瀛樼被鍨?鎽樿嚜APUE):
void setbuf(FILE *restrict fp, char *restrict buf);
int setvbuf(FILE *restrict fp, char *restrict buf, int mode, size_t size);
榪欎簺鍑芥暟蹇呴』鍦ㄦ祦鎵撳紑涔嬪悗銆佷絾鏄湭瀵規祦鍋氫換浣曟搷浣滀箣鍓嶈璋冪敤(鍥犱負姣忎釜鍑芥暟閮介渶瑕佷竴涓湁鏁堢殑鏂囦歡鎸囬拡浣滀負絎竴涓弬鏁?銆?/span>
鍒╃敤setbuf錛屽彲浠ユ墦寮鎴栬呭叧闂紦瀛樸備負浜嗘墦寮緙撳瓨錛宐uf鍙傛暟蹇呴』涓涓ぇ灝忎負BUFSIZ鐨勭紦瀛橈紝BUFSIZ鏄畾涔夊湪stdio銆俬涓殑甯擱噺銆?amp;amp;lt;&lt;ISO/IEC 9899&gt;&gt;瑕佹眰錛欱UFSIZ鑷沖皯涓?56銆傚鏋滆鍏抽棴緙撳瓨錛屽彲浠ュ皢buf璁炬垚NULL銆?/span>
鍒╃敤setvbuf錛屾垜浠彲浠ヨ瀹氱紦瀛樼被鍨嬨傝繖鏄氳繃mode鍙傛暟鎸囧畾鐨勩?/span>
鍏充簬榪欎袱涓嚱鏁幫紝鍙互鐪嬩笅琛紙鎽樿嚜APUE錛夛細
Function |
mode |
buf |
Buffer and length |
Type of buffering |
---|---|---|---|---|
setbuf |
non-null |
user buf of length BUFSIZ |
fully buffered or line buffered |
|
NULL |
(no buffer) |
unbuffered |
||
setvbuf |
_IOLBF |
non-null |
user buf of length size |
fully buffered |
NULL |
system buffer of appropriate length |
|||
_IOFBF |
non-null |
user buf of length size |
line buffered |
|
NULL |
system buffer of appropriate length |
|||
_IONBF |
(ignored) |
(no buffer) |
unbuffered |
闇瑕佹敞鎰忕殑鏄細濡傛灉鍦ㄥ嚱鏁板唴涓烘祦鍒嗛厤浜嗚嚜鍔ㄥ彉閲忎綔涓虹紦瀛橈紝閭d箞鍦ㄩ鍑轟箣鍓嶉渶瑕佸皢嫻佸叧闂傚洜姝ゆ渶濂借緋葷粺鑷繁鍒嗛厤緙撳瓨錛岃繖浜涚紦瀛樺湪嫻佸叧闂殑鏃跺欎細鑷姩琚噴鏀俱?/span>
3.濡傛灉娓呯悊杈撳叆緙撳瓨
鍏充簬榪欑偣鍙互鍙傜湅comp.lang.c FAQ鐨凲uestion12.26b:
Q: If fflush won't work, what can I use to flush input?
A: It depends on what you're trying to do. If you're trying to get rid of an unread newline or other unexpected input after calling scanf (see questions 12.18a-12.19), you really need to rewrite or replace the call to scanf (see question 12.20). Alternatively, you can consume the rest of a partially-read line with a simple code fragment like
while((c = getchar()) != '\n' && c != EOF)
/* discard */ ;
(You may also be able to use the curses flushinp function.)
There is no standard way to discard unread characters from a stdio input stream. Some vendors do implement fflush so that fflush(stdin) discards unread characters, although portable programs cannot depend on this. (Some versions of the stdio library implement fpurge or fabort calls which do the same thing, but these aren't standard, either.) Note, too, that flushing stdio input buffers is not necessarily sufficient: unread characters can also accumulate in other, OS-level input buffers. If you're trying to actively discard input (perhaps in anticipation of issuing an unexpected prompt to confirm a destructive action, for which an accidentally-typed ``y'' could be disastrous), you'll have to use a system-specific technique to detect the presence of typed-ahead input; see questions 19.1 and 19.2. Keep in mind that users can become frustrated if you discard input that happened to be typed too quickly.
References: ISO Sec. 7.9.5.2
H&S Sec. 15.24. 鍑犵偣闇瑕佹敞鎰忕殑鍦版柟
setbuf() has to do with the delivery of bytes between the
C library FILE* management layer and the OS I/O layer.Calls to fread(), fgets(), fgetc(), and getchar() work within
whatever FILE* buffered data is available, and when that data
is exhausted, the calls request that the FILE* buffer be refilled
by the system I/O layer.When full buffering is turned on, that refill operation results in the
FILE* layer requesting that the operating system hand it a full
buffer's worth of data; when buffering is turned off, that
refill operation results in the FILE* layer requesting that the
operating system return a single character....setting an input stream to be unbuffered
does NOT tell the operating system to tell the device driver
to go into any kind of "raw" single-character mode. There are
system-specific calls such as ioctl() and tcsetterm() that
control what the device driver will do.
褰撶劧錛屽崟綰敤鏉ョ紪杈戞枃浠剁殑璇濊繕鏄痸im鏂逛究涓浜涳紝姣曠珶vim鍖哄垎妯″紡錛屾湁浜涙搷浣滃彲浠ョ敤寰堝皯鐨勬寜閿揩閫熺殑瀹屾垚銆?/p>
涓嶇煡閬揺macs鐨勫畯褰曞埗鍔熻兘濡備綍銆傛劅瑙塿im閲岄潰鐨勫畯鐪熺殑鏄お濂界敤浜嗭紝寮勫緱鎴戝緢鏄垗涓嶅緱vim銆傝鏄湁涓紪杈戝櫒鑳介泦鍚坴im鐨勯珮鏁堝揩鎹瘋窡emacs鐨勫己澶ф墿灞曡兘鍔涘氨濂戒簡銆?/p>
http://www.shnenglu.com/lucency/services/metaweblog.aspx
google blog api
http://www.blogger.com:80/feeds/default/blogs