• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            大規(guī)模高性能網(wǎng)絡(luò)服務(wù)器編程 大型游戲服務(wù)器編程


            大規(guī)模高性能網(wǎng)絡(luò)服務(wù)器編程 大型游戲服務(wù)器編程 完成端口模型 TCP UDP P2P 網(wǎng)絡(luò)編程

                       C++博客 | 首頁(yè) | 發(fā)新隨筆 | 發(fā)新文章 | 聯(lián)系 | 聚合 | 管理

                          


            Git是什么?

                引用Linux之父Linus的話:Git --- The stupid content tracker, 傻瓜內(nèi)容跟蹤器。
                簡(jiǎn)單來(lái)說(shuō)Git是一個(gè)免費(fèi)的、開(kāi)源的版本控制軟件,從功能上講,跟我們比較熟悉的CVS,Subversion,VSS這類(lèi)版本控制軟件沒(méi)什么兩樣。
                不同于上述版本控制軟件的是,git是一個(gè)分布式的版本控制軟件,它采用了分布式版本庫(kù)的方式,不必服務(wù)器端軟件支持。Git 的速度很快,合并跟蹤(merge tracing)能力很出色。 

                 事實(shí)上,有很多非常有名的軟件就是采用git做為版本控制軟件,包括Linux Kernel, perl, x.org等等

                git的官方網(wǎng)站:http://git-scm.com/


            Windows版本的安裝

                去http://code.google.com/p/msysgit/下載window下的安裝包,直接安裝,安裝過(guò)程中在“選擇環(huán)境變量”選擇“Use Git Bash Only”,在之后的安裝選項(xiàng)中選擇“使用SSH”

            常用配置
                啟動(dòng)git bash,配置email,腳本如下:
                $ git config --global user.name "Your Name"
                $ git config --global user.email "your@email.address"

              生成公鑰,用于身份認(rèn)證
                key-keygen.exe -C "your@email.address" -t rsa

              解決中文目錄支持問(wèn)題:
                ls不能顯示中文目錄 
                解決辦法:在git/etc/git-completion.bash中增加一行:
                         alias ls='ls --show-control-chars --color=auto'

                git commit不能提交中文注釋
                解決辦法:修改git/etc/inputrc中對(duì)應(yīng)的行: 
                         set output-meta on
                         set convert-meta off 

                git log無(wú)法顯示中文注釋
                解決辦法:在git/etc/profile中增加一行:
                export LESSCHARSET=iso8859

            與github配合使用:
                參見(jiàn)http://blog.itmem.com/archives/1157
            posted @ 2010-08-23 15:59 iKusamba 閱讀(7045) | 評(píng)論 (1)編輯 收藏


            del /s *.obj
            del /s *.pch
            del /s vc70.idb
            del /s *.pdb
            del /s *.ncb
            del /s *.suo
            del /s buildlog.htm
            posted @ 2010-08-23 10:33 iKusamba 閱讀(1179) | 評(píng)論 (0)編輯 收藏

             

            1, PCH文件

            預(yù)編譯頭文件(一般擴(kuò)展名為.PCH),是把一個(gè)工程中較穩(wěn)定的代碼預(yù)先編譯好放在一個(gè)文件(.PCH)里.這些預(yù)先編譯好的代碼可以是任何的C/C++代碼--甚至可以是inline函數(shù),只它們?cè)谡麄€(gè)工程中是較為穩(wěn)定的,即在工程開(kāi)發(fā)過(guò)程中不會(huì)經(jīng)常被修改的代碼.

            為什么需要預(yù)編譯頭文件?一言以蔽之:提高編譯速度.一般地,編譯器以文件為單位編譯,如果修改了一工程中的一個(gè)文件則所有文件都要重新編譯,包括頭文件里的所有東西(eg.Macro宏,Preprocessor預(yù)處理),而VC程序中,這些頭文件中所包括的東西往往是非常大的,編譯之將占很長(zhǎng)的時(shí)間.但它們又不常被修改,是較穩(wěn)定的,為單獨(dú)的一個(gè)小文件而重新編譯整個(gè)工程的所有文件導(dǎo)致編譯效率下降,因此引入了.PCH文件.

            如何使用預(yù)編譯頭文件以提高編譯速度?要使用預(yù)編譯頭文件,必須指定一個(gè)頭文件(.H),它包含我們不會(huì)經(jīng)常修改的代碼和其他的頭文件,然后用這個(gè)頭文件(.H)來(lái)生成一個(gè)預(yù)編譯頭文件(.PCH)VC默認(rèn)的頭文件就是StdAfx.h,因?yàn)轭^文件是不能編譯的,所以我們還需要一個(gè).CPP文件來(lái)作橋梁,VC默認(rèn)的文件為StdAfx.cpp,這個(gè)文件里只有一句代碼就是:#include "StdAfx.h".接下來(lái)要用它生成.PCH文件,涉及到幾個(gè)重要的預(yù)編譯指令:/Yu,/Yc,/Yx,/Fp.簡(jiǎn)單地說(shuō),/Yc是用來(lái)生成.PCH文件的編譯開(kāi)關(guān).在Project->setting->C/C++的Category里的Precompiled Header,然后在左邊的樹(shù)形視圖中選擇用來(lái)編譯生成.PCH文件的.CPP文件(默認(rèn)即StdAfx.cpp)你就可以看到/Yc這個(gè)開(kāi)關(guān),它表示這個(gè)文件編譯了以后是否生成.PCH文件(可能/Yc的c表示create)./Fp指令指定生成的.PCH文件的名字及路徑(可能/Fp的p代表path)./Yu的u即use使用,工程中只要包括了.H文件的文件都會(huì)有這個(gè)/Yu指令.如果選擇自動(dòng)Automatic...的話則原來(lái)為/Yc的地方就換成了/Yx指令.如果選擇自動(dòng),則每次編譯時(shí)編譯器會(huì)看以前有沒(méi)有生成過(guò).PCH文件,有則不現(xiàn)生成否則就再次編譯產(chǎn)生.PCH文件.

            注意:

            A,實(shí)際上,由Appzard項(xiàng)目向?qū)傻哪J(rèn)的頭文件及CPP文件StdAfx.h和StdAfx.cpp可以是任何名字的.原因很簡(jiǎn)單.但如果你要這樣做就要記得修改相應(yīng)的Project->setting...下的幾個(gè)預(yù)編譯指令(/Yc,/Yu,/Yx,/Fp)的參數(shù).

            B.在任何一個(gè)包括了將要預(yù)編譯的頭文件而使用了.PCH文件的工程文件的開(kāi)頭,一定必須要是在最開(kāi)頭,你要包含那個(gè)指定生成.PCH文件的.H文件(通過(guò).CPP文件包括,默認(rèn)為StdAfx.cpp),如果沒(méi)包括將產(chǎn)生我最開(kāi)頭產(chǎn)生的錯(cuò)誤.如果不是在最開(kāi)頭包括將產(chǎn)生讓你意想不到的莫名其妙錯(cuò)誤,如若不信,盍為試之?

            C.預(yù)編譯文件.PCH生成之很耗時(shí)間,而且生成之后它也很占磁盤(pán)空間,常在5-6M,注意項(xiàng)目完成之后及時(shí)清理無(wú)用的.PCH文件以節(jié)約磁盤(pán)空間.

            D.如果丟了或刪了.PCH文件而以后要再修改工程文件時(shí),可將指定的/Yc的.CPP文件(默認(rèn)為StdAfx.cpp)重新編譯一次即可再次生成.PCH文件,不用傻傻的按F7或Rebuild All

             
            2, NCB文件

            .ncb 無(wú)編譯瀏覽文件(no compile browser)。當(dāng)自動(dòng)完成功能出問(wèn)題時(shí)可以刪除此文件。build后會(huì)自動(dòng)生成

             
            3, OBJ文件

            目標(biāo)文件,一般是程序編譯后的二進(jìn)制文件,再通過(guò)鏈接器和資源文件鏈接就成exe文件了。

            OBJ只給出了程序的相對(duì)地址,而EXE是絕對(duì)地址。

             
            4, PDB文件

            程序數(shù)據(jù)庫(kù) (PDB) 文件保存著調(diào)試和項(xiàng)目狀態(tài)信息,使用這些信息可以對(duì)程序的調(diào)試配置進(jìn)行增量鏈接。當(dāng)以 /ZI 或 /Zi(用于 C/C++)生成時(shí),將創(chuàng)建一個(gè) PDB 文件。

             在 Visual C++ 中,/Fd 選項(xiàng)用于命名由編譯器創(chuàng)建的PDB 文件。當(dāng)使用向?qū)г赩isual Studio 中創(chuàng)建項(xiàng)目時(shí),/Fd 選項(xiàng)被設(shè)置為創(chuàng)建一個(gè)名為 project.PDB 的 PDB。

             如果使用生成文件創(chuàng)建 C/C++ 應(yīng)用程序,并指定 /ZI 或 /Zi 而不指定 /Fd 時(shí),則最終將生成兩個(gè) PDB 文件:

             *VC80.PDB   (更籠統(tǒng)地說(shuō)就是 VCx0.PDB,其中 x 表示 Visual C++ 的版本。)該文件存儲(chǔ)各個(gè) OBJ 文件的所有調(diào)試信息并與項(xiàng)目生成文件駐留在同一個(gè)目錄中。

             *project.PDB   該文件存儲(chǔ) .exe 文件的所有調(diào)試信息。對(duì)于C/C++,它駐留在 \debug 子目錄中。

            每當(dāng)創(chuàng)建 OBJ 文件時(shí),C/C++ 編譯器都將調(diào)試信息合并到 VCx0.PDB 中。插入的信息包括類(lèi)型信息,但不包括函數(shù)定義等符號(hào)信息。因此,即使每個(gè)源文件都包含公共頭文件(如 <windows.h>),這些頭文件中的 typedef 也只存儲(chǔ)一次,而不是在每個(gè) OBJ 文件中都存在。

             鏈接器將創(chuàng)建 project.PDB,它包含項(xiàng)目的 EXE 文件的調(diào)試信息。project.PDB文件包含完整的調(diào)試信息(包括函數(shù)原型),而不僅僅是在 VCx0.PDB 中找到的類(lèi)型信息。這兩個(gè) PDB 文件都允許增量更新。鏈接器還在其創(chuàng)建的 .exe 或 .dll 文件中嵌入 .pdb 文件的路徑。

             Visual Studio 調(diào)試器使用 EXE 或 DLL 文件中的PDB 路徑查找 project.PDB 文件。如果調(diào)試器在該位置無(wú)法找到 PDB 文件或者如果路徑無(wú)效(例如,如果項(xiàng)目被移動(dòng)到了另一臺(tái)計(jì)算機(jī)上),調(diào)試器將搜索包含 EXE 的路徑,即在“選項(xiàng)”對(duì)話框(“調(diào)試”文件夾,“符號(hào)”節(jié)點(diǎn))中指定的符號(hào)路徑。調(diào)試器不會(huì)加載與所調(diào)試的二進(jìn)制不匹配的 PDB。

             
            5, ILK文件

            在增量鏈接時(shí),LINK 更新在第一次增量鏈接期間創(chuàng)建的 .ilk 狀態(tài)文件。該文件和 .exe文件或 .dll 文件具有相同的基名稱(chēng),并具有擴(kuò)展名 .ilk。在后面的增量鏈接期間,LINK 更新 .ilk 文件。如果缺少 .ilk 文件,則 LINK 執(zhí)行完全鏈接并創(chuàng)建新的 .ilk 文件。如果 .ilk 文件無(wú)法使用,則 LINK 執(zhí)行非增量鏈接。有關(guān)增量鏈接的詳細(xì)信息,請(qǐng)參見(jiàn)漸進(jìn)式鏈接(/INCREMENTAL) 選項(xiàng)。

             
            6, MAP文件

            Windows和Linux系統(tǒng)下都有map文件,map文件一般是用來(lái)保存符號(hào)的地址信息。這里的符號(hào)一般是指函數(shù)名及變量(局部、全局)。根據(jù)這個(gè)地址信息,便可以把地址翻譯成相應(yīng)的符號(hào),很多系統(tǒng)工具、debug方法都要用到這種信息。

             (一)一個(gè)程序編譯完以后內(nèi)容會(huì)分成兩大類(lèi)保存,一類(lèi)是code,一類(lèi)是data:

            (1)code指程序代碼,常存在.text section

            (2)data指存程序中聲明的變量,常存在.data section,未初始化的變量會(huì)被存在.bss section。

             (二)Windows

            (1)單個(gè)模塊的map文件

            在Windows下每一個(gè)模塊(dll/exe)對(duì)應(yīng)一個(gè)map文件,只需編譯時(shí)打開(kāi)相應(yīng)的選項(xiàng)即可。

            visual studio中方法:右擊工程,選擇Properties,然后選擇 Configuration Properties -Linker - Debugging,將Generate Map File項(xiàng)改成Yes。

            編譯后在debug/release目錄里便可以找到與應(yīng)用程序同名的map文件。

             如下為map文件內(nèi)容:

            Timestamp is4b9603e2 (Tue Mar 09 16:16:34 2010) //這個(gè)是時(shí)間戳,每次編譯都不同,后面符號(hào)對(duì)應(yīng)的地址一般也不同。

             Preferred loadaddress is 00010000 //這是編譯時(shí)的預(yù)裝載地址,實(shí)際上模塊被加載的地址可能跟這個(gè)不同,所以來(lái)確定某個(gè)地址對(duì)應(yīng)哪個(gè)符號(hào)信息的時(shí)候,還需要知道該模塊加載在內(nèi)存的真正起始地址,然后根據(jù)偏移量來(lái)確定。

             Start         Length     Name                   Class

            0001:00000000 001c3950H .text                   CODE ==》存放程序代碼

            0003:000008b8000af67cH .data                   DATA ==》初始化的變量

            0003:000aff40003930b1H .bss                    DATA ==》未初始化的變量

             (2)操作系統(tǒng)總的map文件:不知道有沒(méi)有。

             (3)dumpbin

            dumpbin是一個(gè)反匯編工具,可以輸出exe/dll文件的許多信息。

            dumpbin /allyourmodulename > a.txt 可以把所有的信息保存在一個(gè)a.txt中,里面可以找到時(shí)間戳、原debug路徑信息及函數(shù)列表等。

             如下:

            FILE HEADERVALUES

                         1C2 machine (Thumb)

                           6 number of sections

                        49EC0BAE time date stamp Mon Apr 2013:44:14 2009 //時(shí)間戳

                           0 file pointer to symbol table

                           0 number of symbols

                          E0 size of optional header

                        2102 characteristics

                               Executable

                               32 bit word machine

                               DLL

             

            OPTIONAL HEADERVALUES

                         10B magic # (PE32)

                        9.00 linker version

                       53E00 size of code

                       76A00size of initialized data

                           0 size of uninitialized data

                       502ACentry point (100502AC)

                        1000 base of code

                       55000 base of data

                    10000000 image base (10000000 to100CDFFF)

                        1000 section alignment

                         200 file alignment

                       5.01 operating system version

                        0.00 image version

                        5.01 subsystem version

                           0 Win32 version

                       CE000 size of image

                         400 size of headers

             

            其中 10000000 image base (10000000 to 100CDFFF)是重要的信息,與map file中的 Preferred load address is10000000 意義相同。

             DebugDirectories

             

                    Time Type       Size     RVA Pointer

                -------- ------ -------- -------- --------

                49EC0BAE cv           81 000020FC      CFC   Format: RSDS, {A5C699F0-C26D-427E-BC54-3504731BA9B8}, 1,d:\Projects\Final\MyUsbToPc_CPL\MyUsbToPc\Windows Mobile 6 Professional SDK(ARMV4I)\Debug\MyUsbToPc.pdb //原編譯路徑

             

                      Begin    End     Prolog   Excpt 32bit Fixup 【Function Name】

             0000000010001000 10001040 10001010   N     Y    Y DllMain

            0000000810001040 10001064 10001050   N     Y    Y ?InitApplet@@YAHPAUHWND__@@@Z (int __cdecl InitApplet(struct HWND__*))

            0000001010001064 10001068 10001064   N     Y    Y ?TermApplet@@YAXXZ (void __cdecl TermApplet(void))

            0000001810001068 100013DC 10001078   N     Y    Y CPlApplet

            00000020 1000141C 100014B4 10001420   N    Y     Y _DllMainCRTStartup

            00000028100014B4 100014BC 100014B4   N     Y    Y GetCurrentProcess

            00000030100014BC 100014F0 100014C0  N     Y     Y

            00000038 100014F0 1000155C 100014F4  N     Y     Y _cinit

            00000040 1000155C 10001660 10001560   N    Y     Y

            0000004810001660 10001678 10001664   N     Y    Y exit

            0000005010001678 10001690 1000167C   N    Y     Y _exit

            0000005810001690 100016AC10001694   N     Y    Y _cexit

            00000060 100016AC 100016F8 100016B0   N    Y     Y _c_exit

             

            begin欄對(duì)應(yīng)的地址與map里的地址是一致的,非常類(lèi)似于map文件。

            【注意:很多exe或dll在編譯時(shí)時(shí)將此信息隱藏的,F(xiàn)unction Name會(huì)變成空的】

             (三)Linux

            (1)單個(gè)模塊的map文件

            暫還不清楚,大家知道的請(qǐng)告知。

            (2)操作系統(tǒng)總的map文件

            linux系統(tǒng)編譯Image后會(huì)生成一個(gè)system.map,里面存了被編譯進(jìn)內(nèi)核的符號(hào)信息,不同次的編譯生成的system.map會(huì)有差異。

            因?yàn)槭遣僮飨到y(tǒng)的符號(hào)信息,裝載的地址都是固定的,所以不像windows單個(gè)模塊那樣靠偏移量定位,直接通過(guò)地址就可以直接找到對(duì)應(yīng)的符號(hào)。

             

            其內(nèi)容的重要的幾個(gè)符號(hào)如下:

            _stext//代碼段開(kāi)始

            _etext//代碼段結(jié)束

             __data_start//初始化的數(shù)據(jù)開(kāi)始

            _edata//初始化的數(shù)據(jù)結(jié)束

             __bss_start//未初始化數(shù)據(jù)開(kāi)始

            _end//全部結(jié)束

             

            Linux相對(duì)windows有個(gè)很重要的不同是,linux啟動(dòng)后在proc\kallsyms里也有一份類(lèi)似Map文件的信息,cat命令可看到其內(nèi)容,有了這個(gè)就可以得到任何一個(gè)內(nèi)核的符號(hào)(變量及函數(shù)名)的地址信息,而不需要在編譯完內(nèi)核后特意保存map文件,這真是一個(gè)巨大的寶藏。

            而且,proc\kallsym的信息比system.map多,在最后會(huì)有module部分的符號(hào)信息,這些信息會(huì)隨著系統(tǒng)的變化而變化。

             

            (3)nm命令

            nm命令用來(lái)顯示某個(gè)可執(zhí)行文件的符號(hào)信息。符號(hào)信息中會(huì)包含全局變量(比如下面的xyz)和函數(shù)名(比如下面的main),還有一些編譯器插入的符號(hào)(比如下面的__data_start,__bss_start)

             第二列表示符號(hào)的屬性,其中大寫(xiě)代表global,小寫(xiě)代表local

             

            Usage: nm[option(s)] [file(s)]

            List symbols in[file(s)] (a.out by default).

             

            示例:

             nm helo

             08049f20 d_DYNAMIC

            08049ff4 d_GLOBAL_OFFSET_TABLE_

            080484ec R_IO_stdin_used

                     w _Jv_RegisterClasses

            08049f10 d__CTOR_END__

            08049f0c d__CTOR_LIST__

            08049f18 D__DTOR_END__

            08049f14 d__DTOR_LIST__

            08048500 r__FRAME_END__

            08049f1c d__JCR_END__

            08049f1c d__JCR_LIST__

            0804a020 A__bss_start

            0804a00c D__data_start

            080484a0 t __do_global_ctors_aux

            08048340 t__do_global_dtors_aux

            0804a010 D__dso_handle

                     w __gmon_start__

            0804849a T __i686.get_pc_thunk.bx

            08049f0c d__init_array_end

            08049f0c d__init_array_start

            08048430 T__libc_csu_fini

            08048440 T__libc_csu_init

                     U __libc_start_main@@GLIBC_2.0

            0804a020 A _edata

            0804a028 A _end

            080484cc T _fini

            080484e8 R_fp_hw

            08048298 T _init

            08048310 T_start

            0804a020 bcompleted.6635

            0804a00c Wdata_start

            0804a024 bdtor_idx.6637

            080483a0 t frame_dummy

            080483c4 T main

                     U printf@@GLIBC_2.0

            0804a014 D x

            0804a018 D y

            0804a01c D z

             

            helo.c如下:

            #include<stdio.h>

             int x = 10;

            int y = 20;

            int z = 30;

             extern int__data_start;//這里引用了編譯器插入的符號(hào)

             int main(void)

            {

                    int *ds = &__data_start;

                     printf("%p\n", ds);

                    printf("now x = %d\n", x);

                     ds+=3;

                    *ds = 100;

                    printf("now x = %d\n", x);

            }

            7, IDB文件

            The compiler savesstate information from the first compile in the project’s .IDB file     (the default name is project.IDB or VC60.IDBfor files compiled without a project).

            The compiler usesthis state information to speed subsequent compiles.

             

            8, SLN文件

            Visual   Studio.Solution   通過(guò)為環(huán)境提供對(duì)項(xiàng)目、項(xiàng)目項(xiàng)和解決方案項(xiàng)在磁盤(pán)上位置的引用,可將它們組織到解決方案中。     比如是生成Debug模式,還是Release模式,是通用CPU還是專(zhuān)用的等

             

            9, SUO文件

            解決方案用戶選項(xiàng)   記錄所有將與解決方案建立關(guān)聯(lián)的選項(xiàng),以便在每次打開(kāi)時(shí),它都包含您所做的自定義設(shè)置。比如你的VS布局,你的項(xiàng)目最后編譯的而又沒(méi)有關(guān)掉的文件(下次打開(kāi)時(shí)用)

            10,  

            posted @ 2010-08-23 10:31 iKusamba 閱讀(2996) | 評(píng)論 (0)編輯 收藏
            僅列出標(biāo)題
            共4頁(yè): 1 2 3 4 

            公告

            導(dǎo)航

            隨筆分類(lèi)

            最新隨筆

            最新評(píng)論

            閱讀排行榜

            久久99免费视频| 亚洲欧美日韩中文久久| 国内精品伊人久久久久av一坑 | 亚洲av伊人久久综合密臀性色| 久久国产精品二国产精品| 久久99毛片免费观看不卡 | 精品亚洲综合久久中文字幕| 久久无码人妻一区二区三区午夜| 无码人妻久久一区二区三区蜜桃| 欧美久久天天综合香蕉伊| 久久久久这里只有精品| 一本色综合久久| 国产美女亚洲精品久久久综合| 中文字幕日本人妻久久久免费 | 久久棈精品久久久久久噜噜| 久久久久人妻一区精品性色av| 精品久久久久久亚洲精品| 久久精品www人人爽人人| 久久精品国产只有精品2020| 日韩欧美亚洲综合久久影院d3| 国产一区二区三精品久久久无广告| 久久国产精品免费| 久久精品人妻中文系列| 久久国产亚洲精品无码| 久久精品无码一区二区三区免费| 亚洲人成网站999久久久综合| 精品国产乱码久久久久久呢| 精品一区二区久久久久久久网站| 久久精品二区| 久久精品国产亚洲精品2020| 久久国产高清一区二区三区| 日本欧美久久久久免费播放网| 久久精品免费一区二区三区| 香蕉久久久久久狠狠色| 久久精品国产亚洲麻豆| 国产aⅴ激情无码久久| 国产成人精品久久亚洲| 亚洲精品国精品久久99热一| 9999国产精品欧美久久久久久| 久久久www免费人成精品| 色偷偷888欧美精品久久久|