青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

面對現實,超越自己
逆水行舟,不進則退
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 王海光 閱讀(655) | 評論 (0)編輯 收藏
禁用關閉按鈕

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

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

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

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

視圖類調用非模態對話時,如何銷毀分配的內存

簡要步驟:

1視圖類在調用非模態對話框時,將自身的指針傳遞給非模態對話框。
2當非模態對話框結束時,向視圖類發送自定義消息,由自定義消息處理函數來釋放內存。

具體代碼步驟:

1定義自定義消息  #define WM_RELEASEPLAYSOUNDDC (WM_USER+1001)
2修改非模態對話框類的構造函數,便于將視圖指針傳遞進去。

非模態對話框.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);

};

非模態對話框.cpp文件中

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

3、在非模態對話框結束的時候發送自定義消息
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文件中定義消息處理函數的實現:

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 王海光 閱讀(1773) | 評論 (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()加入(這個方法需要自己加入 在ClassWizard 中,注意在ClassName中選擇CXApp,Messages列表框中選擇ExitInstance)

Gdiplus::GdiplusShutdown(m_gdiplusToken);

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

此時GDI+設置成功。

具體代碼如下:

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);
}
}

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

本文轉自:
http://blog.csdn.net/highyyy/article/details/6125763

 

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

方法一:使用Jsoncpp生成的lib文件
      解壓上面下載的Jsoncpp文件,在jsoncpp-src-0.5.0/makefiles/vs71目錄里找到jsoncpp.sln,用VS2008版本編譯,默認生成靜態鏈接庫。 在工程中引用,只需要包含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工程編譯選項要和VS工程中的編譯選項保持一致。如lib文件工程編譯選項為MT(或MTd),VS工程中也要選擇MT(或MTd),否則會出現編譯錯誤問題,debug和release下生成的lib文件名字不同,注意不要看錯了,當成一個文件來使用(我就犯了這個錯誤)。

方法二:使用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三個文件的Precompiled Header屬性設置為Not Using Precompiled Headers否則編譯會出現錯誤。

jsoncpp 使用詳解

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

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


下面是從網上找的代碼示例:
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();  // 訪問節點,upload_id = "UP000000"  
        int code = root["code"].asInt();    // 訪問節點,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())  // 訪問節點,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();// 訪問節點,Return the member named key if it exist, defaultValue otherwise.    

        int file_size = root["files"].size();  // 得到"files"的數組個數  
        for(int i = 0; i < file_size; ++i)  // 遍歷數組  
        {  
            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;   // 構建對象  
        Json::Value new_item, new_item1;  
        new_item["date"] = "2011-11-11";  
        new_item1["time"] = "11:11:11";  
        arrayObj.append(new_item);  // 插入數組成員  
        arrayObj.append(new_item1); // 插入數組成員  
        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();  
        // 輸出無格式json字符串  
        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測試代碼,使用VS2008編譯通過。
posted @ 2013-12-26 15:59 王海光 閱讀(123721) | 評論 (6)編輯 收藏
一、修改標題
方法1:在CMainFrame中PreCreateWindow(CREATESTRUCT& cs)進行更改,如下:
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("測試標題");
    cs.cx = 970;
    cs.cy = 650;
    return CXTPFrameWnd::PreCreateWindow(cs);
}

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

    SetTitle(_T("測試標題"));

    return TRUE;
}

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

標題\n\nTestSingleTitle\n\n\nTestSingleTitle.Document\nTestSingleTitle.Document

 三、去掉標題的后半部分

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

 

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

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

 方法3:在CMainFramePreCreateWindow函數中修改窗口風格:

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

iostat, vmstat, ifstat 三合一的工具,用來查看系統性能(我在《性能調優攻略》中提到過那三個xxstat工具)。

slurm

查看網絡流量的一個工具  閱讀全文
posted @ 2013-12-06 17:32 王海光 閱讀(687) | 評論 (0)編輯 收藏
PreTranslateMessage(MSG* pMsg)中調用DoModal()模態窗口如下:

 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);//調用對話框函數
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 }

再單擊對話框上的按鈕時發送斷言中斷,具體位置如下:


::IsWindow(m_hWnd)

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

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

改變程序的執行
———————

    一旦使用GDB掛上被調試程序,當程序運行起來后,你可以根據自己的調試思路來動態地在GDB中更改當前被調試程序的運行線路或是其變量的值,這個強大的功能能夠讓你更好的調試你的程序,比如,你可以在程序的一次運行中走遍程序的所有分支。  
一、修改變量值

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

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

二、跳轉執行

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

三、產生信號量

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

四、強制函數返回

    如果你的調試斷點在某個函數中,并還有語句沒有執行完。你可以使用return命令強制函數忽略還沒有執行的語句并返回。    
    return
    return <expression>
    使用return命令取消當前函數的執行,并立即返回,如果指定了<expression>,那么該表達式的值會被認作函數的返回值。    
五、強制調用函數

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

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

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

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

下面是幾個相關于GDB語言環境的命令:

    show language 
        查看當前的語言環境。如果GDB不能識為你所調試的編程語言,那么,C語言被認為是默認的環境。        
    info frame
        查看當前函數的程序語言。        
    info source
        查看當前文件的程序語言。    
如果GDB沒有檢測出當前的程序語言,那么你也可以手動設置當前的程序語言。使用set language命令即可做到。

    當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后跟上被列出來的程序語言名,來設置當前的語言環境。 

后記
——

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

本文轉自:http://blog.csdn.net/haoel/article/details/2885

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

七、設置顯示選項

    GDB中關于顯示的選項比較多,這里我只例舉大多數常用的選項。

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


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

    show print address 
        查看當前地址顯示選項是否打開。       
    set print array 
    set print array on 
        打開數組顯示,打開后當數組顯示時,每個元素占一行,如果不打開的話,每個元素則以逗號分隔。這個選項默認是關閉的。與之相關的兩個命令如下,我就不再多說了。     
    set print array off 
    show print array

    set print elements <number-of-elements>
        這個選項主要是設置數組的,如果你的數組太大了,那么就可以指定一個<number-of-elements>來指定數據顯示的最大長度,當到達這個長度時,GDB就不再往下顯示了。如果設置為0,則表示不限制。        
    show print elements 
        查看print elements的選項信息。        
    set print null-stop <on/off>
        如果打開了這個選項,那么當顯示字符串時,遇到結束符則停止顯示。這個選項默認為off。  
    set print pretty on 
        如果打開printf pretty這個選項,那么當GDB顯示結構體時會比較漂亮。如:

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

    set print pretty off
        關閉printf pretty這個選項,GDB顯示結構體時會如下顯示:      
            $1 = {next = 0x0, flags = {sweet = 1, sour = 1}, meat = 0x54 "Pork"}        
    show print pretty 
        查看GDB是如何顯示結構體的。        
    set print sevenbit-strings <on/off>
        設置字符顯示,是否按“/nnn”的格式顯示,如果打開,則字符串或字符數據按/nnn顯示,如“/065”。   
    show print sevenbit-strings
        查看字符顯示開關是否打開。         
    set print union <on/off>
        設置顯示結構體時,是否顯式其內的聯合體數據。例如有以下數據結構:       
        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}};

        當打開這個開關時,執行 p foo 命令后,會如下顯示:
            $1 = {it = Tree, form = {tree = Acorn, bug = Cocoon}}
        
        當關閉這個開關時,執行 p foo 命令后,會如下顯示:
            $1 = {it = Tree, form = {...}}

    show print union
        查看聯合體數據的顯示方式   
    set print object <on/off>
        在C++中,如果一個對象指針指向其派生類,如果打開這個選項,GDB會自動按照虛方法調用的規則顯示輸出,如果關閉這個選項的話,GDB就不管虛函數表了。這個選項默認是off。
    show print object
        查看對象選項的設置。     
    set print static-members <on/off>
        這個選項表示,當顯示一個C++對象中的內容是,是否顯示其中的靜態數據成員。默認是on。   
    show print static-members
        查看靜態數據成員選項設置。        
    set print vtbl <on/off>
        當此選項打開時,GDB將用比較規整的格式來顯示虛函數表時。其默認是關閉的。       
    show print vtbl
        查看虛函數顯示格式的選項。        
八、歷史記錄

    當你用GDB的print查看程序運行時的數據時,你每一個print都會被GDB記錄下來。GDB會以$1, $2, $3 .....這樣的方式為你每一個print命令編上號。于是,你可以使用這個編號訪問以前的表達式,如$1。這個功能所帶來的好處是,如果你先前輸入了一個比較長的表達式,如果你還想查看這個表達式的值,你可以使用歷史記錄來訪問,省去了重復輸入。
九、GDB環境變量

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

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

本文轉自:http://blog.csdn.net/haoel/article/details/2884

posted @ 2013-11-28 12:18 王海光 閱讀(450) | 評論 (0)編輯 收藏
僅列出標題
共27頁: 1 2 3 4 5 6 7 8 9 Last 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久综合激情| 欧美不卡视频一区发布| 国产精一区二区三区| 欧美成人首页| 美女精品一区| 麻豆精品在线视频| 欧美成人a∨高清免费观看| 美女爽到呻吟久久久久| 蜜臀久久99精品久久久久久9 | 亚洲精品美女免费| 免费日韩一区二区| 免费在线看一区| 亚洲国产精品va在线观看黑人| 亚洲国产成人在线视频| 99视频精品全部免费在线| 国产精品99久久不卡二区 | 久久久夜夜夜| 欧美成人自拍| 国产精品久久久久久久久久ktv | 伊人一区二区三区久久精品| 在线免费精品视频| 中文一区字幕| 久久精品一区| 亚洲国产精品国自产拍av秋霞| 亚洲人成人99网站| 先锋资源久久| 欧美激情网站在线观看| 国产伦精品一区二区三区在线观看| 国产一区二区三区精品久久久 | 欧美人与禽猛交乱配视频| 欧美三区不卡| 黑丝一区二区| 一区二区免费在线视频| 久久久久91| 99热精品在线观看| 麻豆国产精品777777在线| 国产精品国产a| 亚洲日本欧美在线| 久久精品亚洲精品国产欧美kt∨| 亚洲国产精品小视频| 一区二区三区黄色| 国产精品久久久久秋霞鲁丝| 裸体丰满少妇做受久久99精品| 欧美乱人伦中文字幕在线| 国产一区二区三区久久久| 日韩一区二区免费高清| 久久久91精品国产一区二区三区 | 欧美一级午夜免费电影| 欧美精品自拍偷拍动漫精品| 狠狠色伊人亚洲综合成人| 亚洲欧美www| 日韩视频在线一区| 美女国产一区| 一区精品在线| 久久久久国产精品厨房| 亚洲素人一区二区| 欧美日韩亚洲不卡| 99av国产精品欲麻豆| 久久国产精品99国产| 99精品久久久| 男男成人高潮片免费网站| 一区二区三区在线高清| 久久xxxx精品视频| 亚洲欧美国产77777| 国产精品热久久久久夜色精品三区| 99热在这里有精品免费| 亚洲国产精品va| 欧美大片在线观看一区| 亚洲美女91| 日韩亚洲欧美一区二区三区| 欧美日韩国产一区精品一区| 亚洲伦理一区| 日韩小视频在线观看| 欧美日韩在线免费视频| 亚洲性感美女99在线| 中文在线一区| 国产在线不卡精品| 久久青青草原一区二区| 噜噜噜久久亚洲精品国产品小说| 一区二区三区在线视频免费观看 | 久久久久国产免费免费| 亚洲国产精品精华液2区45| 欧美插天视频在线播放| 免费观看日韩av| 一区二区三区精品国产| 亚洲天堂av图片| 国产一区激情| 亚洲第一主播视频| 欧美日韩视频免费播放| 性色av一区二区三区在线观看| 亚洲欧美资源在线| 在线播放中文字幕一区| 91久久综合| 国产欧美一区二区精品性色| 狠狠入ady亚洲精品| 美女视频网站黄色亚洲| 欧美电影电视剧在线观看| 亚洲一区二区网站| 久久av二区| 一本色道久久88精品综合| 亚洲永久在线| 亚洲黄色三级| 亚洲在线1234| 亚洲欧洲精品一区| 亚洲欧美日韩电影| 亚洲精品国久久99热| 亚洲欧美成人一区二区三区| 亚洲国产一区在线| 午夜精品视频在线观看一区二区| 精品91视频| 一区二区三区高清| 亚洲电影免费在线| 亚洲欧美日韩国产中文在线| 亚洲欧洲日韩在线| 欧美一区二区三区四区在线观看地址| 亚洲欧洲一区二区三区| 欧美一区二区三区免费在线看| 亚洲最新视频在线| 久久久久综合一区二区三区| 亚洲欧美另类在线观看| 欧美国产精品v| 麻豆乱码国产一区二区三区| 欧美网站大全在线观看| 亚洲国产成人av| 激情久久久久久久| 在线综合亚洲欧美在线视频| 亚洲欧洲一区二区天堂久久| 欧美伊人久久| 欧美一级淫片播放口| 欧美日韩调教| 最新国产成人av网站网址麻豆| 国内精品久久久久久| 亚洲综合日韩| 亚洲欧美日韩区| 欧美三级日本三级少妇99| 亚洲国产色一区| 亚洲精品看片| 欧美成人精品一区| 欧美mv日韩mv国产网站| 在线观看欧美亚洲| 久久国内精品自在自线400部| 欧美在线看片| 国产欧美一区二区精品性色| 亚洲欧美视频一区二区三区| 午夜精品剧场| 国产精品视频内| 亚洲一级在线观看| 欧美一区成人| 国产日产精品一区二区三区四区的观看方式| 亚洲区在线播放| 亚洲精品五月天| 欧美精品在线一区| 这里只有精品视频| 性色av香蕉一区二区| 国产亚洲一区二区精品| 欧美在线播放一区二区| 美日韩精品免费观看视频| 亚洲国产精品嫩草影院| 欧美77777| 99热免费精品| 久久国产欧美| 亚洲黑丝在线| 亚洲视频一区二区免费在线观看| 亚洲深夜av| 国产精品日韩欧美一区| 欧美在线观看网址综合| 欧美激情第一页xxx| 99视频有精品| 国产精品色一区二区三区| 香蕉久久夜色| 欧美国产日韩一区二区在线观看 | 欧美日韩喷水| 亚洲午夜影视影院在线观看| 久久国产夜色精品鲁鲁99| 在线播放中文字幕一区| 欧美日韩国产区一| 午夜精品影院| 欧美激情精品久久久久久免费印度| 日韩亚洲欧美成人| 国产精品综合| 欧美承认网站| 性8sex亚洲区入口| 91久久精品国产91性色| 欧美一区二区三区四区高清| 91久久精品一区二区别| 国产精品国产三级国产aⅴ无密码| 欧美在线播放一区| 一区二区三区精品| 欧美大片一区| 欧美一区二区三区的| 亚洲乱码国产乱码精品精98午夜| 国产伦理一区| 欧美日韩国产91| 久久久久久久高潮| 亚洲小说区图片区| 亚洲激情av| 女同性一区二区三区人了人一| 亚洲综合视频一区| 亚洲免费久久| 亚洲高清久久久|