• <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>
            面對(duì)現(xiàn)實(shí),超越自己
            逆水行舟,不進(jìn)則退
            posts - 269,comments - 32,trackbacks - 0
            代碼如下:
            BOOL CCommonFun::PictureWindows(const CString &strPicFile, CString &sError)
            {
                CString strSystemDir="";
                ::GetSystemDirectory(strSystemDir.GetBuffer(256), 256);
                strSystemDir.ReleaseBuffer();

                CString strRundll = strSystemDir + "\\rundll32.exe";

                CString strParm;
                strParm.Format("%s//shimgvw.dll imageview_fullscreen %s", strSystemDir, strPicFile); 

                HINSTANCE hNewExe = ShellExecute(NULL, "Open", strRundll, strParm, NULL, SW_SHOW);
                if ((DWORD)hNewExe <= 32)
                {
                    CString sFormat;
                    sFormat.Format("return value:%d\n", (DWORD)hNewExe);
                    sError = sFormat;
                    return FALSE;
                }
                return TRUE;
            }
            posted @ 2014-03-25 18:40 王海光 閱讀(652) | 評(píng)論 (0)編輯 收藏
            禁用關(guān)閉按鈕

            在 WM_CREATE 消息處理程序中的 MDI 子框架窗口 (CMDIChildWnd 派生類) 禁用在關(guān)閉按鈕使用下面的代碼:

            CMenu *pSysMenu = GetSystemMenu(FALSE); 
            ASSERT(pSysMenu 
            != NULL); 
            VERIFY(pSysMenu
            ->RemoveMenu(SC_CLOSE, MF_BYCOMMAND));

            此時(shí)的最大、最小化、還原按鈕也消失不見。通過在PreCreateWindow函數(shù)中修改來實(shí)現(xiàn)顯示最大、最小化、還原按鈕。
            cs.style += WS_MINIMIZEBOX|WS_SIZEBOX; 

            posted @ 2014-03-25 18:37 王海光 閱讀(2738) | 評(píng)論 (0)編輯 收藏

            視圖類調(diào)用非模態(tài)對(duì)話時(shí),如何銷毀分配的內(nèi)存

            簡(jiǎn)要步驟:

            1、視圖類在調(diào)用非模態(tài)對(duì)話框時(shí),將自身的指針傳遞給非模態(tài)對(duì)話框。
            2、當(dāng)非模態(tài)對(duì)話框結(jié)束時(shí),向視圖類發(fā)送自定義消息,由自定義消息處理函數(shù)來釋放內(nèi)存。

            具體代碼步驟:

            1、定義自定義消息  #define WM_RELEASEPLAYSOUNDDC (WM_USER+1001)
            2修改非模態(tài)對(duì)話框類的構(gòu)造函數(shù),便于將視圖指針傳遞進(jìn)去。

            非模態(tài)對(duì)話框.h文件中

            class CTestDialog : public CDialog
            {
                DECLARE_DYNAMIC(CPlaySound)

            public:
                //CTestDialog (CWnd* pParent = NULL);   // standard constructor
                CTestDialog (CView* pParent);   // standard constructor
                virtual ~CTestDialog ();
                CView *pView;

            // Dialog Data
                enum { IDD = IDD_TEST_DIALOG };

            protected:
                virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

                DECLARE_MESSAGE_MAP()
            public:
                virtual BOOL OnInitDialog();
                afx_msg LRESULT OnNcHitTest(CPoint point);

            };

            非模態(tài)對(duì)話框.cpp文件中

            IMPLEMENT_DYNAMIC(CTestDialog, CDialog)
            //CTestDialog::CTestDialog(CWnd* pParent /*=NULL*/)
            CTestDialog::CTestDialog(CView* pParent)
                : CDialog(CTestDialog::IDD, pParent)
            {
                pView = pParent;
            }

            3、在非模態(tài)對(duì)話框結(jié)束的時(shí)候發(fā)送自定義消息
            void CTestDialog::OnBnClickedBtnClose()
            {
                // TODO: Add your control notification handler code here
                pView->PostMessage(WM_RELEASEPLAYSOUNDDC, 0, 0);
                OnOK();
            }

            4、在視圖類.h文件中,增加定義:
            afx_msg LRESULT OnReleaseDialog(WPARAM wparam,LPARAM lparam);

            5、在視圖類.cpp文件中,增加消息映射部分:
            ON_MESSAGE(WM_DIALOGOK,OnDialogOk)

            6、在視圖類.cpp文件中定義消息處理函數(shù)的實(shí)現(xiàn):

            LRESULT CTestView::OnReleaseDialog(WPARAM wparam,LPARAM lparam)
            {
                if (m_pPlaySound != NULL)
                {
                    delete m_pPlaySound;
                    m_pPlaySound = NULL;
                }

                return 0;
            }
            posted @ 2014-03-07 15:01 王海光 閱讀(1767) | 評(píng)論 (0)編輯 收藏

            2.在你將要使用GDI+的工程中,完成初始化工作:
            StdAfx.h中加入

            #define ULONG_PTR unsigned long
            #include <Gdiplus.h>
            using namespace Gdiplus;

            3.在CXApp頭文件中加入

            ULONG_PTR        m_gdiplusToken;

             4.在 BOOL CXApp::InitInstance() 中添加

            GdiplusStartupInput     m_gdiplusStartupInput;
            GdiplusStartup(&m_gdiplusToken&m_gdiplusStartupInput, NULL);

             5.在int CXApp::ExitInstance()加入(這個(gè)方法需要自己加入 在ClassWizard 中,注意在ClassName中選擇CXApp,Messages列表框中選擇ExitInstance)

            Gdiplus::GdiplusShutdown(m_gdiplusToken);

             6.在Project->stting->Link->Intput->Additional Dependencies中加入gdiplus.lib

            此時(shí)GDI+設(shè)置成功。

            具體代碼如下:

            int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)   
            {   
            UINT num = 0;                     // number of image encoders   
            UINT size = 0;                   // size of the image encoder array in bytes   
            ImageCodecInfo* pImageCodecInfo = NULL;   
            GetImageEncodersSize(&num, &size);   
            if(size == 0)   
            return -1;     //   Failure   
            pImageCodecInfo = (ImageCodecInfo*)(malloc(size));   
            if(pImageCodecInfo == NULL)   
            return -1;     //   Failure   
            GetImageEncoders(num, size, pImageCodecInfo);   
            for(UINT j = 0; j < num; ++j)   
            {   
            if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )   
            {   
            *pClsid = pImageCodecInfo[j].Clsid;   
            free(pImageCodecInfo);   
            return j;     //   Success   
            }           
            }   
            free(pImageCodecInfo);   
            return -1;     //   Failure   
            }
            void SaveFile(Bitmap* pImage, const wchar_t* pFileName)
            {
            EncoderParameters encoderParameters;
            CLSID jpgClsid
            GetEncoderClsid(L"image/jpeg", &jpgClsid);
            encoderParameters.Count = 1;
            encoderParameters.Parameter[0].Guid = EncoderQuality;
            encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong;
            encoderParameters.Parameter[0].NumberOfValues = 1;
            // Save the image as a JPEG with quality level 100.
            ULONG             quality;
            quality = 100;
            encoderParameters.Parameter[0].Value = &quality;
            Status status = pImage->Save(pFileName, &jpgClsid, &encoderParameters);
            if (status != Ok
            {
            wprintf(L"%d Attempt to save %s failed./n", status, pFileName);
            }
            }

            //調(diào)用方式:
            Bitmap newbitmap(L"d://d.bmp");//加載BMP
            const wchar_t *pFileName=L"d://new.jpg";//保存路徑
            SaveFile(&newbitmap,pFileName );

            本文轉(zhuǎn)自:
            http://blog.csdn.net/highyyy/article/details/6125763

             

            posted @ 2014-01-09 14:30 王海光 閱讀(1420) | 評(píng)論 (0)編輯 收藏
            JSON(JavaScript Object Notation) 是一種輕量級(jí)的數(shù)據(jù)交換格式,和xml類似,本文主要對(duì)VS2008中使用Jsoncpp解析json的方法做一下記錄。
            Jsoncpp是個(gè)跨平臺(tái)的開源庫(kù),下載地址:http://sourceforge.net/projects/jsoncpp/,我下載的是v0.5.0,壓縮包大約104K。

            方法一:使用Jsoncpp生成的lib文件
                  解壓上面下載的Jsoncpp文件,在jsoncpp-src-0.5.0/makefiles/vs71目錄里找到j(luò)soncpp.sln,用VS2008版本編譯,默認(rèn)生成靜態(tài)鏈接庫(kù)。 在工程中引用,只需要包含include/json下的頭文件及生成的.lib文件即可。
                  如何包含lib文件:在.cpp文件中#pragma comment(lib."json_vc71_libmt.lib"),在工程屬性中Linker下Input中Additional Dependencies寫入lib文件名字(Release下為json_vc71_libmt.lib,Debug為json_vc71_libmtd.lib

            注意:Jsoncpp的lib工程編譯選項(xiàng)要和VS工程中的編譯選項(xiàng)保持一致。如lib文件工程編譯選項(xiàng)為MT(或MTd),VS工程中也要選擇MT(或MTd),否則會(huì)出現(xiàn)編譯錯(cuò)誤問題,debug和release下生成的lib文件名字不同,注意不要看錯(cuò)了,當(dāng)成一個(gè)文件來使用(我就犯了這個(gè)錯(cuò)誤)。

            方法二:使用Jsoncpp包中的.cpp.h文件
                  解壓上面下載的Jsoncpp文件,把jsoncpp-src-0.5.0文件拷貝到工程目錄下,jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\include\jsonjsoncpp-src-0.5.0\jsoncpp-src-0.5.0\src\lib_json目錄里的文件包含到VS工程中,在VS工程的屬性C/C++下General中Additional Include Directories包含頭文件目錄.\jsoncpp-src-0.5.0\include。在使用的cpp文件中包含json頭文件即可,如:#include "json/json.h"。將json_reader.cpp、json_value.cpp和json_writer.cpp三個(gè)文件的Precompiled Header屬性設(shè)置為Not Using Precompiled Headers否則編譯會(huì)出現(xiàn)錯(cuò)誤。

            jsoncpp 使用詳解

            jsoncpp 主要包含三種類型的 class:Value、Reader、Writer。jsoncpp 中所有對(duì)象、類名都在 namespace Json 中,包含 json.h 即可。

            Json::Value 只能處理 ANSI 類型的字符串,如果 C++ 程序是用 Unicode 編碼的,最好加一個(gè) Adapt 類來適配。


            下面是從網(wǎng)上找的代碼示例:
            1. 從字符串解析json
                const char* str = "{\"uploadid\": \"UP000000\",\"code\": 100,\"msg\": \"\",\"files\": \"\"}";  

                Json::Reader reader;  
                Json::Value root;  
                if (reader.parse(str, root))  // reader將Json字符串解析到root,root將包含Json里所有子元素  
                {  
                    std::string upload_id = root["uploadid"].asString();  // 訪問節(jié)點(diǎn),upload_id = "UP000000"  
                    int code = root["code"].asInt();    // 訪問節(jié)點(diǎn),code = 100 
                }  
            2. 從文件解析json
            int ReadJsonFromFile(const char* filename)  
            {  
                Json::Reader reader;// 解析json用Json::Reader   
                Json::Value root; // Json::Value是一種很重要的類型,可以代表任意類型。如int, string, object, array         

                std::ifstream is;  
                is.open (filename, std::ios::binary );    
                if (reader.parse(is, root, FALSE))  
                {  
                    std::string code;  
                    if (!root["files"].isNull())  // 訪問節(jié)點(diǎn),Access an object value by name, create a null member if it does not exist.  
                        code = root["uploadid"].asString();  
                    
                    code = root.get("uploadid", "null").asString();// 訪問節(jié)點(diǎn),Return the member named key if it exist, defaultValue otherwise.    

                    int file_size = root["files"].size();  // 得到"files"的數(shù)組個(gè)數(shù)  
                    for(int i = 0; i < file_size; ++i)  // 遍歷數(shù)組  
                    {  
                        Json::Value val_image = root["files"][i]["images"];  
                        int image_size = val_image.size();  
                        for(int j = 0; j < image_size; ++j)  
                        {  
                            std::string type = val_image[j]["type"].asString();  
                            std::string url  = val_image[j]["url"].asString(); 
                            printf("type : %s, url : %s \n", type.c_str(), url.c_str());
                        }  
                    }  
                }  
                is.close();  

                return 0;  
            3. 向文件中插入json
            void WriteJsonData(const char* filename)
            {
                Json::Reader reader;  
                Json::Value root; // Json::Value是一種很重要的類型,可以代表任意類型。如int, string, object, array        

                std::ifstream is;  
                is.open (filename, std::ios::binary );    
                if (reader.parse(is, root))  
                {  
                    Json::Value arrayObj;   // 構(gòu)建對(duì)象  
                    Json::Value new_item, new_item1;  
                    new_item["date"] = "2011-11-11";  
                    new_item1["time"] = "11:11:11";  
                    arrayObj.append(new_item);  // 插入數(shù)組成員  
                    arrayObj.append(new_item1); // 插入數(shù)組成員  
                    int file_size = root["files"].size();  
                    for(int i = 0; i < file_size; ++i)  
                        root["files"][i]["exifs"] = arrayObj;   // 插入原json中 
                    std::string out = root.toStyledString();  
                    // 輸出無格式j(luò)son字符串  
                    Json::FastWriter writer;  
                    std::string strWrite = writer.write(root);
                    std::ofstream ofs;
                    ofs.open("test_write.json");
                    ofs << strWrite;
                    ofs.close();
                }  

                is.close();  
            }

            下面是我寫的使用Jsoncpp生成lib文件的工程示例:Jsoncpp測(cè)試代碼,使用VS2008編譯通過。
            posted @ 2013-12-26 15:59 王海光 閱讀(123676) | 評(píng)論 (6)編輯 收藏
            一、修改標(biāo)題
            方法1:在CMainFrame中PreCreateWindow(CREATESTRUCT& cs)進(jìn)行更改,如下:
            BOOL CKTLXSubjectShowFrame::PreCreateWindow(CREATESTRUCT& cs)
            {
                // TODO: Add your specialized code here and/or call the base class
                cs.style &=~WS_MAXIMIZEBOX;//禁用最大化按鈕
                cs.style &=~WS_SIZEBOX;
                cs.style &=~FWS_ADDTOTITLE;

                cs.lpszName = _T("測(cè)試標(biāo)題");
                cs.cx = 970;
                cs.cy = 650;
                return CXTPFrameWnd::PreCreateWindow(cs);
            }

            方法2:在doc類中OnNewDocument函數(shù)修改,添加修改的標(biāo)題,如下:
            BOOL CKTLXSubjectShowDoc::OnNewDocument()
            {
                if (!CDocument::OnNewDocument())
                    return FALSE;

                SetTitle(_T("測(cè)試標(biāo)題"));

                return TRUE;
            }

            二、修改標(biāo)題后半部分
            單文檔標(biāo)題通常會(huì)有兩部分組成,例如:標(biāo)題名稱—工程名稱,修改StringTable的IDR_MAINFRAME的標(biāo)題,將第一個(gè)\n之前的字符串替換為

            標(biāo)題\n\nTestSingleTitle\n\n\nTestSingleTitle.Document\nTestSingleTitle.Document

             三、去掉標(biāo)題的后半部分

            方法1:在CTestSingleTitleApp::InitInstance()中調(diào)用如下語句m_pMainWnd->SetWindowText(_T("標(biāo)題"));或在其他地方用(AfxGetMainWnd())->SetWindowText(_T("標(biāo)題"));也可以得到相同的結(jié)果。

             

            方法2:可以通過利用CWnd::SetWindowText即:void SetWindowText( LPCTSTR lpszString );重載CFramWnd類的OnUpdateFrameTitle函數(shù)

            void CMainFrame::OnUpdateFrameTitle(BOOL bAddToTitle)
            {
                // TODO: 在此添加專用代碼和/或調(diào)用基類 
                SetWindowText(_T("標(biāo)題"));
                CFrameWnd::OnUpdateFrameTitle(bAddToTitle);
            }

             方法3:在CMainFramePreCreateWindow函數(shù)中修改窗口風(fēng)格:

            BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
            {
                      cs.style &= ~(LONG) FWS_ADDTOTITLE;
                      return CFrameWnd::PreCreateWindow(cs);
            }
            posted @ 2013-12-13 10:28 王海光 閱讀(7479) | 評(píng)論 (1)編輯 收藏
                 摘要: dstat & sar

            iostat, vmstat, ifstat 三合一的工具,用來查看系統(tǒng)性能(我在《性能調(diào)優(yōu)攻略》中提到過那三個(gè)xxstat工具)。

            slurm

            查看網(wǎng)絡(luò)流量的一個(gè)工具  閱讀全文
            posted @ 2013-12-06 17:32 王海光 閱讀(682) | 評(píng)論 (0)編輯 收藏
            PreTranslateMessage(MSG* pMsg)中調(diào)用DoModal()模態(tài)窗口如下:

             1 BOOL CMainDlg::PreTranslateMessage(MSG* pMsg)
             2 {
             3     // TODO: Add your specialized code here and/or call the base class
             4     if ( pMsg->message == WM_LBUTTONDOWN)
             5     {
             6         GetWindowRect(m_oldRect);
             7         ::SetCapture(this->m_hWnd);
             8         m_bCanDrag = TRUE;
             9         m_lastPt = pMsg->pt ;
            10     }
            11     else if ( pMsg->message == WM_LBUTTONUP)
            12     {
            13         if( m_bCanDrag )
            14         {
            15             ::ReleaseCapture();
            16             m_bCanDrag = FALSE;
            17             GetWindowRect(m_newRect);
            18             if (m_oldRect.EqualRect(m_newRect))
            19             {
            20                 GetMainItemID(pMsg);//調(diào)用對(duì)話框函數(shù)
            21                 //return TRUE;
            22             }
            23         }
            24     } 
            25     else if( pMsg->message == WM_MOUSEMOVE)
            26     {
            27         if( m_bCanDrag )
            28         {
            29             CRect rc;
            30             GetWindowRect(&rc);
            31             rc.OffsetRect( pMsg->pt.x - m_lastPt.x , pMsg->pt.y - m_lastPt.y  ) ;
            32             m_lastPt = pMsg->pt;
            33             this->MoveWindow( rc );
            34         }
            35     }
            36 
            37     return CDialog::PreTranslateMessage(pMsg);
            38 }

            39  void CMainDlg::GetMainItemID(MSG* pMsg)
            40 {
            41     if (pMsg->hwnd == GetDlgItem( IDC_BTN_MYCOMPUTER )->m_hWnd)
            42     {
            43        CTestDlg dlg;
            44        dlg.DoModal();
            45     }
            46 }

            再單擊對(duì)話框上的按鈕時(shí)發(fā)送斷言中斷,具體位置如下:


            ::IsWindow(m_hWnd)

            函數(shù)功能:該函數(shù)確定給定的窗口句柄是否標(biāo)識(shí)一個(gè)已存在的窗口。
            函數(shù)原型:BOOL IsWindow(HWND hWnd);
            參數(shù):
            hWnd:被測(cè)試窗口的句柄。
            返回值:如果窗口句柄標(biāo)識(shí)了一個(gè)已存在的窗口,返回值為非零;如果窗口句柄未標(biāo)識(shí)一個(gè)已存在窗口,返回值為零。

            可能原因:在PreTranslateMessage里的獲取對(duì)應(yīng)m_hWnd,DoModal()模態(tài)對(duì)話框退出后,m_hWnd不是有效的窗口句柄。
            解決辦法:處理完WM_LBUTTONUP后,需要返回TRUE。
            posted @ 2013-12-05 10:58 王海光 閱讀(2484) | 評(píng)論 (0)編輯 收藏

            改變程序的執(zhí)行
            ———————

                一旦使用GDB掛上被調(diào)試程序,當(dāng)程序運(yùn)行起來后,你可以根據(jù)自己的調(diào)試思路來動(dòng)態(tài)地在GDB中更改當(dāng)前被調(diào)試程序的運(yùn)行線路或是其變量的值,這個(gè)強(qiáng)大的功能能夠讓你更好的調(diào)試你的程序,比如,你可以在程序的一次運(yùn)行中走遍程序的所有分支。  
            一、修改變量值

                修改被調(diào)試程序運(yùn)行時(shí)的變量值,在GDB中很容易實(shí)現(xiàn),使用GDB的print命令即可完成。如:
                    (gdb) print x=4  
                x=4這個(gè)表達(dá)式是C/C++的語法,意為把變量x的值修改為4,如果你當(dāng)前調(diào)試的語言是Pascal,那么你可以使用Pascal的語法:x:=4。   
                在某些時(shí)候,很有可能你的變量和GDB中的參數(shù)沖突,如:  
                    (gdb) whatis width
                    type = double
                    (gdb) p width
                    $4 = 13
                    (gdb) set width=47
                    Invalid syntax in expression.

                因?yàn)椋瑂et width是GDB的命令,所以,出現(xiàn)了“Invalid syntax in expression”的設(shè)置錯(cuò)誤,此時(shí),你可以使用set var命令來告訴GDB,width不是你GDB的參數(shù),而是程序的變量名,如:  
                    (gdb) set var width=47       
                另外,還可能有些情況,GDB并不報(bào)告這種錯(cuò)誤,所以保險(xiǎn)起見,在你改變程序變量取值時(shí),最好都使用set var格式的GDB命令。   

            二、跳轉(zhuǎn)執(zhí)行

                一般來說,被調(diào)試程序會(huì)按照程序代碼的運(yùn)行順序依次執(zhí)行。GDB提供了亂序執(zhí)行的功能,也就是說,GDB可以修改程序的執(zhí)行順序,可以讓程序執(zhí)行隨意跳躍。這個(gè)功能可以由GDB的jump命令來完:   
                jump <linespec>
                指定下一條語句的運(yùn)行點(diǎn)。<linespce>可以是文件的行號(hào),可以是file:line格式,可以是+num這種偏移量格式。表式著下一條運(yùn)行語句從哪里開始。    
                jump <address>
                這里的<address>是代碼行的內(nèi)存地址。    
                注意,jump命令不會(huì)改變當(dāng)前的程序棧中的內(nèi)容,所以,當(dāng)你從一個(gè)函數(shù)跳到另一個(gè)函數(shù)時(shí),當(dāng)函數(shù)運(yùn)行完返回時(shí)進(jìn)行彈棧操作時(shí)必然會(huì)發(fā)生錯(cuò)誤,可能結(jié)果還是非常奇怪的,甚至于產(chǎn)生程序Core Dump。所以最好是同一個(gè)函數(shù)中進(jìn)行跳轉(zhuǎn)。    
                熟悉匯編的人都知道,程序運(yùn)行時(shí),有一個(gè)寄存器用于保存當(dāng)前代碼所在的內(nèi)存地址。所以,jump命令也就是改變了這個(gè)寄存器中的值。于是,你可以使用“set $pc”來更改跳轉(zhuǎn)執(zhí)行的地址。如:   
                set $pc = 0x485

            三、產(chǎn)生信號(hào)量

                使用singal命令,可以產(chǎn)生一個(gè)信號(hào)量給被調(diào)試的程序。如:中斷信號(hào)Ctrl+C。這非常方便于程序的調(diào)試,可以在程序運(yùn)行的任意位置設(shè)置斷點(diǎn),并在該斷點(diǎn)用GDB產(chǎn)生一個(gè)信號(hào)量,這種精確地在某處產(chǎn)生信號(hào)非常有利程序的調(diào)試。   
                語法是:signal <singal>,UNIX的系統(tǒng)信號(hào)量通常從1到15。所以<singal>取值也在這個(gè)范圍。    
                single命令和shell的kill命令不同,系統(tǒng)的kill命令發(fā)信號(hào)給被調(diào)試程序時(shí),是由GDB截獲的,而single命令所發(fā)出一信號(hào)則是直接發(fā)給被調(diào)試程序的。  

            四、強(qiáng)制函數(shù)返回

                如果你的調(diào)試斷點(diǎn)在某個(gè)函數(shù)中,并還有語句沒有執(zhí)行完。你可以使用return命令強(qiáng)制函數(shù)忽略還沒有執(zhí)行的語句并返回。    
                return
                return <expression>
                使用return命令取消當(dāng)前函數(shù)的執(zhí)行,并立即返回,如果指定了<expression>,那么該表達(dá)式的值會(huì)被認(rèn)作函數(shù)的返回值。    
            五、強(qiáng)制調(diào)用函數(shù)

                call <expr>
                表達(dá)式中可以一是函數(shù),以此達(dá)到強(qiáng)制調(diào)用函數(shù)的目的。并顯示函數(shù)的返回值,如果函數(shù)返回值是void,那么就不顯示。    
                另一個(gè)相似的命令也可以完成這一功能——print,print后面可以跟表達(dá)式,所以也可以用他來調(diào)用函數(shù),print和call的不同是,如果函數(shù)返回void,call則不顯示,print則顯示函數(shù)返回值,并把該值存入歷史數(shù)據(jù)中。

            在不同語言中使用GDB
            ——————————

            GDB支持下列語言:C, C++, Fortran, PASCAL, Java, Chill, assembly, 和 Modula-2。一般說來,GDB會(huì)根據(jù)你所調(diào)試的程序來確定當(dāng)然的調(diào)試語言,比如:發(fā)現(xiàn)文件名后綴為“.c”的,GDB會(huì)認(rèn)為是C程序。文件名后綴為“.C, .cc, .cp, .cpp, .cxx, .c++”的,GDB會(huì)認(rèn)為是C++程序。而后綴是“.f, .F”的,GDB會(huì)認(rèn)為是Fortran程序,還有,后綴為如果是“.s, .S”的會(huì)認(rèn)為是匯編語言。

            也就是說,GDB會(huì)根據(jù)你所調(diào)試的程序的語言,來設(shè)置自己的語言環(huán)境,并讓GDB的命令跟著語言環(huán)境的改變而改變。比如一些GDB命令需要用到表達(dá)式或變量時(shí),這些表達(dá)式或變量的語法,完全是根據(jù)當(dāng)前的語言環(huán)境而改變的。例如C/C++中對(duì)指針的語法是*p,而在Modula-2中則是p^。并且,如果你當(dāng)前的程序是由幾種不同語言一同編譯成的,那到在調(diào)試過程中,GDB也能根據(jù)不同的語言自動(dòng)地切換語言環(huán)境。這種跟著語言環(huán)境而改變的功能,真是體貼開發(fā)人員的一種設(shè)計(jì)。

            下面是幾個(gè)相關(guān)于GDB語言環(huán)境的命令:

                show language 
                    查看當(dāng)前的語言環(huán)境。如果GDB不能識(shí)為你所調(diào)試的編程語言,那么,C語言被認(rèn)為是默認(rèn)的環(huán)境。        
                info frame
                    查看當(dāng)前函數(shù)的程序語言。        
                info source
                    查看當(dāng)前文件的程序語言。    
            如果GDB沒有檢測(cè)出當(dāng)前的程序語言,那么你也可以手動(dòng)設(shè)置當(dāng)前的程序語言。使用set language命令即可做到。

                當(dāng)set language命令后什么也不跟的話,你可以查看GDB所支持的語言種類:    
                    (gdb) set language
                    The currently understood settings are:
                    
                    local or auto    Automatic setting based on source file
                    c                Use the C language
                    c++              Use the C++ language
                    asm              Use the Asm language
                    chill            Use the Chill language
                    fortran          Use the Fortran language
                    java             Use the Java language
                    modula-2         Use the Modula-2 language
                    pascal           Use the Pascal language
                    scheme           Use the Scheme language
                    
                于是你可以在set language后跟上被列出來的程序語言名,來設(shè)置當(dāng)前的語言環(huán)境。 

            后記
            ——

                GDB是一個(gè)強(qiáng)大的命令行調(diào)試工具。大家知道命令行的強(qiáng)大就是在于,其可以形成執(zhí)行序列,形成腳本。UNIX下的軟件全是命令行的,這給程序開發(fā)提代供了極大的便利,命令行軟件的優(yōu)勢(shì)在于,它們可以非常容易的集成在一起,使用幾個(gè)簡(jiǎn)單的已有工具的命令,就可以做出一個(gè)非常強(qiáng)大的功能。 
                于是UNIX下的軟件比Windows下的軟件更能有機(jī)地結(jié)合,各自發(fā)揮各自的長(zhǎng)處,組合成更為強(qiáng)勁的功能。而Windows下的圖形軟件基本上是各自為營(yíng),互相不能調(diào)用,很不利于各種軟件的相互集成。在這里并不是要和Windows做個(gè)什么比較,所謂“寸有所長(zhǎng),尺有所短”,圖形化工具還是有不如命令行的地方。(看到這句話時(shí),希望各位千萬再也不要認(rèn)為我就是“鄙視圖形界面”,和我抬杠了 )  
                我是根據(jù)版本為5.1.1的GDB所寫的這篇文章,所以可能有些功能已被修改,或是又有更為強(qiáng)勁的功能。而且,我寫得非常倉(cāng)促,寫得比較簡(jiǎn)略,并且,其中我已經(jīng)看到有許多錯(cuò)別字了(我用五筆,所以錯(cuò)字讓你看不懂),所以,我在這里對(duì)我文中的差錯(cuò)表示萬分的歉意。  
                文中所羅列的GDB的功能時(shí),我只是羅列了一些帶用的GDB的命令和使用方法,其實(shí),我這里只講述的功能大約只占GDB所有功能的60%吧,詳細(xì)的文檔,還是請(qǐng)查看GDB的幫助和使用手冊(cè)吧,或許,過段時(shí)間,如果我有空,我再寫一篇GDB的高級(jí)使用。 
                我個(gè)人非常喜歡GDB的自動(dòng)調(diào)試的功能,這個(gè)功能真的很強(qiáng)大,試想,我在UNIX下寫個(gè)腳本,讓腳本自動(dòng)編譯我的程序,被自動(dòng)調(diào)試,并把結(jié)果報(bào)告出來,調(diào)試成功,自動(dòng)checkin源碼庫(kù)。一個(gè)命令,編譯帶著調(diào)試帶著checkin,多爽啊。只是GDB對(duì)自動(dòng)化調(diào)試目前支持還不是很成熟,只能實(shí)現(xiàn)半自動(dòng)化,真心期望著GDB的自動(dòng)化調(diào)試功能的成熟。    
                如果各位對(duì)GDB或是別的技術(shù)問題有興趣的話,歡迎和我討論交流。本人目前主要在UNIX下做產(chǎn)品軟件的開發(fā),所以,對(duì)UNIX下的軟件開發(fā)比較熟悉,當(dāng)然,不單單是技術(shù),對(duì)軟件工程實(shí)施,軟件設(shè)計(jì),系統(tǒng)分析,項(xiàng)目管理我也略有心得。歡迎大家找我交流,(QQ是:753640,MSN是:haoel@hotmail.com)

            本文轉(zhuǎn)自:http://blog.csdn.net/haoel/article/details/2885

            posted @ 2013-11-28 12:48 王海光 閱讀(503) | 評(píng)論 (0)編輯 收藏

            七、設(shè)置顯示選項(xiàng)

                GDB中關(guān)于顯示的選項(xiàng)比較多,這里我只例舉大多數(shù)常用的選項(xiàng)。

                set print address 
                set print address on 
                    打開地址輸出,當(dāng)程序顯示函數(shù)信息時(shí),GDB會(huì)顯出函數(shù)的參數(shù)地址。系統(tǒng)默認(rèn)為打開的,如:        
                    (gdb) f
                    #0  set_quotes (lq=0x34c78 "<<", rq=0x34c88 ">>")
                        at input.c:530
                    530         if (lquote != def_lquote)


                set print address off 
                    關(guān)閉函數(shù)的參數(shù)地址顯示,如:       
                    (gdb) set print addr off
                    (gdb) f
                    #0  set_quotes (lq="<<", rq=">>") at input.c:530
                    530         if (lquote != def_lquote)

                show print address 
                    查看當(dāng)前地址顯示選項(xiàng)是否打開。       
                set print array 
                set print array on 
                    打開數(shù)組顯示,打開后當(dāng)數(shù)組顯示時(shí),每個(gè)元素占一行,如果不打開的話,每個(gè)元素則以逗號(hào)分隔。這個(gè)選項(xiàng)默認(rèn)是關(guān)閉的。與之相關(guān)的兩個(gè)命令如下,我就不再多說了。     
                set print array off 
                show print array

                set print elements <number-of-elements>
                    這個(gè)選項(xiàng)主要是設(shè)置數(shù)組的,如果你的數(shù)組太大了,那么就可以指定一個(gè)<number-of-elements>來指定數(shù)據(jù)顯示的最大長(zhǎng)度,當(dāng)?shù)竭_(dá)這個(gè)長(zhǎng)度時(shí),GDB就不再往下顯示了。如果設(shè)置為0,則表示不限制。        
                show print elements 
                    查看print elements的選項(xiàng)信息。        
                set print null-stop <on/off>
                    如果打開了這個(gè)選項(xiàng),那么當(dāng)顯示字符串時(shí),遇到結(jié)束符則停止顯示。這個(gè)選項(xiàng)默認(rèn)為off。  
                set print pretty on 
                    如果打開printf pretty這個(gè)選項(xiàng),那么當(dāng)GDB顯示結(jié)構(gòu)體時(shí)會(huì)比較漂亮。如:

                        $1 = {
                          next = 0x0,
                          flags = {
                            sweet = 1,
                            sour = 1
                          },
                          meat = 0x54 "Pork"
                        }

                set print pretty off
                    關(guān)閉printf pretty這個(gè)選項(xiàng),GDB顯示結(jié)構(gòu)體時(shí)會(huì)如下顯示:      
                        $1 = {next = 0x0, flags = {sweet = 1, sour = 1}, meat = 0x54 "Pork"}        
                show print pretty 
                    查看GDB是如何顯示結(jié)構(gòu)體的。        
                set print sevenbit-strings <on/off>
                    設(shè)置字符顯示,是否按“/nnn”的格式顯示,如果打開,則字符串或字符數(shù)據(jù)按/nnn顯示,如“/065”。   
                show print sevenbit-strings
                    查看字符顯示開關(guān)是否打開。         
                set print union <on/off>
                    設(shè)置顯示結(jié)構(gòu)體時(shí),是否顯式其內(nèi)的聯(lián)合體數(shù)據(jù)。例如有以下數(shù)據(jù)結(jié)構(gòu):       
                    typedef enum {Tree, Bug} Species;
                    typedef enum {Big_tree, Acorn, Seedling} Tree_forms;
                    typedef enum {Caterpillar, Cocoon, Butterfly}
                                  Bug_forms;
                    
                    struct thing {
                      Species it;
                      union {
                        Tree_forms tree;
                        Bug_forms bug;
                      } form;
                    };
                    
                    struct thing foo = {Tree, {Acorn}};

                    當(dāng)打開這個(gè)開關(guān)時(shí),執(zhí)行 p foo 命令后,會(huì)如下顯示:
                        $1 = {it = Tree, form = {tree = Acorn, bug = Cocoon}}
                    
                    當(dāng)關(guān)閉這個(gè)開關(guān)時(shí),執(zhí)行 p foo 命令后,會(huì)如下顯示:
                        $1 = {it = Tree, form = {...}}

                show print union
                    查看聯(lián)合體數(shù)據(jù)的顯示方式   
                set print object <on/off>
                    在C++中,如果一個(gè)對(duì)象指針指向其派生類,如果打開這個(gè)選項(xiàng),GDB會(huì)自動(dòng)按照虛方法調(diào)用的規(guī)則顯示輸出,如果關(guān)閉這個(gè)選項(xiàng)的話,GDB就不管虛函數(shù)表了。這個(gè)選項(xiàng)默認(rèn)是off。
                show print object
                    查看對(duì)象選項(xiàng)的設(shè)置。     
                set print static-members <on/off>
                    這個(gè)選項(xiàng)表示,當(dāng)顯示一個(gè)C++對(duì)象中的內(nèi)容是,是否顯示其中的靜態(tài)數(shù)據(jù)成員。默認(rèn)是on。   
                show print static-members
                    查看靜態(tài)數(shù)據(jù)成員選項(xiàng)設(shè)置。        
                set print vtbl <on/off>
                    當(dāng)此選項(xiàng)打開時(shí),GDB將用比較規(guī)整的格式來顯示虛函數(shù)表時(shí)。其默認(rèn)是關(guān)閉的。       
                show print vtbl
                    查看虛函數(shù)顯示格式的選項(xiàng)。        
            八、歷史記錄

                當(dāng)你用GDB的print查看程序運(yùn)行時(shí)的數(shù)據(jù)時(shí),你每一個(gè)print都會(huì)被GDB記錄下來。GDB會(huì)以$1, $2, $3 .....這樣的方式為你每一個(gè)print命令編上號(hào)。于是,你可以使用這個(gè)編號(hào)訪問以前的表達(dá)式,如$1。這個(gè)功能所帶來的好處是,如果你先前輸入了一個(gè)比較長(zhǎng)的表達(dá)式,如果你還想查看這個(gè)表達(dá)式的值,你可以使用歷史記錄來訪問,省去了重復(fù)輸入。
            九、GDB環(huán)境變量

                你可以在GDB的調(diào)試環(huán)境中定義自己的變量,用來保存一些調(diào)試程序中的運(yùn)行數(shù)據(jù)。要定義一個(gè)GDB的變量很簡(jiǎn)單只需。使用GDB的set命令。GDB的環(huán)境變量和UNIX一樣,也是以$起頭。如:  
                set $foo = *object_ptr 
                使用環(huán)境變量時(shí),GDB會(huì)在你第一次使用時(shí)創(chuàng)建這個(gè)變量,而在以后的使用中,則直接對(duì)其賦值。環(huán)境變量沒有類型,你可以給環(huán)境變量定義任一的類型。包括結(jié)構(gòu)體和數(shù)組。   
                show convenience 
                    該命令查看當(dāng)前所設(shè)置的所有的環(huán)境變量。
                    
                這是一個(gè)比較強(qiáng)大的功能,環(huán)境變量和程序變量的交互使用,將使得程序調(diào)試更為靈活便捷。例如:   
                    set $i = 0
                    print bar[$i++]->contents   
                于是,當(dāng)你就不必,print bar[0]->contents, print bar[1]->contents地輸入命令了。輸入這樣的命令后,只用敲回車,重復(fù)執(zhí)行上一條語句,環(huán)境變量會(huì)自動(dòng)累加,從而完成逐個(gè)輸出的功能。     
            十、查看寄存器

                要查看寄存器的值,很簡(jiǎn)單,可以使用如下命令:  
                info registers 
                    查看寄存器的情況。(除了浮點(diǎn)寄存器)    
                info all-registers
                    查看所有寄存器的情況。(包括浮點(diǎn)寄存器)   
                info registers <regname ...>
                    查看所指定的寄存器的情況。       
                寄存器中放置了程序運(yùn)行時(shí)的數(shù)據(jù),比如程序當(dāng)前運(yùn)行的指令地址(ip),程序的當(dāng)前堆棧地址(sp)等等。你同樣可以使用print命令來訪問寄存器的情況,只需要在寄存器名字前加一個(gè)$符號(hào)就可以了。如:p $eip。

            本文轉(zhuǎn)自:http://blog.csdn.net/haoel/article/details/2884

            posted @ 2013-11-28 12:18 王海光 閱讀(446) | 評(píng)論 (0)編輯 收藏
            僅列出標(biāo)題
            共27頁(yè): 1 2 3 4 5 6 7 8 9 Last 
            色综合久久中文字幕无码| 久久久久久久99精品免费观看| 久久91亚洲人成电影网站| 久久精品国产只有精品2020| 久久久久国产精品麻豆AR影院 | 久久久久亚洲Av无码专| 久久国产精品-国产精品| 久久涩综合| 人人狠狠综合久久亚洲88| 久久这里有精品| 久久精品无码专区免费| 国产综合久久久久久鬼色| 怡红院日本一道日本久久 | 国产精品99久久不卡| 无码人妻精品一区二区三区久久| 国产精品99久久不卡| 2021少妇久久久久久久久久| 18禁黄久久久AAA片| 久久乐国产精品亚洲综合| 久久亚洲欧美日本精品| 久久国产亚洲精品无码| 久久精品青青草原伊人| 四虎国产永久免费久久| 免费精品久久天干天干| 久久精品国产亚洲AV无码娇色| 麻豆久久| 久久综合五月丁香久久激情| 亚洲欧美精品伊人久久| 久久91精品国产91久久小草| 精品免费tv久久久久久久| 久久午夜伦鲁片免费无码| 午夜久久久久久禁播电影| 亚洲va久久久噜噜噜久久| 久久99精品久久久大学生| 久久中文字幕人妻丝袜| 国产亚洲精品久久久久秋霞 | 久久99精品久久久久久动态图 | 国产精品中文久久久久久久| 久久国产欧美日韩精品免费| 色综合久久夜色精品国产| 久久九九久精品国产免费直播|