断点

调试器功能

  断点:

 

  调试器的功能之一,可以让程序中断在需要的地方,从而方便其分析。也可以在一次调试中设置断点,下一次只需让程序自动运行到设置断点位置,便可在上次设置断点的位置中断下来,极大的方便了操作,同时节省了时间。

 

  常用的断点包括:

 

  INT3断点、硬件断点、内存断点、消息断点、条件断点等。

 

  中文词条名:断点

 

  英文词条名:break-point

 

  利用钻井或测井资料进行地层对比时,在单井剖面上出现地层缺失或重复的地方叫断点。

调试


 

   词目:调试
 
   拼音:tíao shì
 
   含义:
 
  1.编好程序后,用各种手段进行查错和排错的过程。作为程序的正确性不仅仅表现在正常功能的完成上,更重要的是对意外情况的正确处理。从心理学的角度考虑,开发人员和调试人员不应该是同一个人。
 
  2.音乐术语,若干高低不同的乐音围绕具有某一稳定感的中心音按一定的音程关系组织在一起,成为一个有机体系。

有编译错误的代码,应该是无法启动调试的。
编译都不过,那里来需要调试的程序?

文件传输 断点传输 c++(ZT)
2009-04-15 11:11

所谓的断点续传就是指:文件在传输过程式中被中断后,在重新传输时,可以从上次的断点处开始传输,这样就可节省时间,和其它资源.

实现关键在这里有两个关键点,其一是检测本地已经下载的文件长度和断点值,其二是在服务端调整文件指针到断点处
实现方法
我们用一个简单的方法来实现断点续传的功能.在传输文件的时候创建一个临时文件用来存放文件的断点位置
在每次发送接受文件时,先检查有没有临时文件,如果有的话就从临时文件中读取断点值,并把文件指针移动到
断点位置开始传输,这样便可以做到断点续传了
实现流程
首次传输其流程如下
1.服务端向客户端传递文件名称和文件长度
2.跟据文件长度计算文件块数(文件分块传输请参照第二篇文章)
3.客户端将传输的块数写入临时文件(做为断点值)
4.若文件传输成功则删除临时文件
首次传输失败后将按以下流程进行
1.客户端从临时文件读取断点值并发送给服务端
2.服务端与客户端将文件指针移至断点处
3.从断点处传输文件
编码实现
因为程序代码并不复杂,且注释也比较详细,这里就给出完整的实现
其服务端实现代码如下

代码:
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
        cout<<"/t/t服务端-断点续传"<<"/t 作者:冷风/n/n"<<"请输入被下载的文件路径 如 C://File.rar /n/n"<<"文件路径: ";
        cin        >>FilePath;
        /*这部分为网络参数与设置,详细请参照源代码......*/
        while(true)
        {
                if(client=accept(server,(sockaddr *)&clientaddr,&len))
                {
                        cout<<"have one connect/n";
                        int nCurrentPos=0;//接受断点值
                        if(recv(client,(char*)&nCurrentPos,sizeof(nCurrentPos),0)==SOCKET_ERROR)
                        {
                                cout<<"The Clinet Socket is Closed/n";
                                break;
                        }else
                        {
                                cout<<"The Currentpos is The"<<nCurrentPos<<"/n";
                                GetFileProc        (nCurrentPos,client);
                        }
                }
        }
        closesocket(server);
        closesocket(client);
        WSACleanup();
        return 0;
        return 0;
}
DWORD GetFileProc        (int nCurrentPos,SOCKET client)
{
        cout <<"Get File Proc is ok/n";
        CFile        file;
        int                nChunkCount=0;        //文件块数
        if(file.Open(FilePath,CFile::modeRead|CFile::typeBinary))
        {
                if(nCurrentPos!=0)
                {
                        file.Seek(nCurrentPos*CHUNK_SIZE,CFile::begin);        //文件指针移至断点处
                        cout<<"file seek is "<<nCurrentPos*CHUNK_SIZE<<"/n";
                }
                int FileLen=file.GetLength();
                nChunkCount=FileLen/CHUNK_SIZE;                                //文件块数
                if(FileLen%nChunkCount!=0)
                        nChunkCount++;
                send(client,(char*)&FileLen,sizeof(FileLen),0);                //发送文件长度
                char *date=new char[CHUNK_SIZE];
                for(int i=nCurrentPos;i<nChunkCount;i++)                //从断点处分块发送
                {       
                        cout<<"send the count"<<i<<"/n";
                        int nLeft;
                        if(i+1==nChunkCount)                                //最后一块
                                nLeft=FileLen-CHUNK_SIZE*(nChunkCount-1);
                        else
                                nLeft=CHUNK_SIZE;
                        int idx=0;
                        file.Read(date,CHUNK_SIZE);
                        while(nLeft>0)
                        {
                                int ret=send(client,&date[idx],nLeft,0);
                                if(ret==SOCKET_ERROR)
                                {
                                        cout<<"Send The Date Error /n";
                                        break;
                                }
                                nLeft-=ret;
                                idx+=ret;
                        }
                }
                file.Close();
                delete[] date;
        }else
        {
                cout<<"open the file error/n";
        }
        return 0;
}
客户端实现代码如下

代码:
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
        cout<<"/t/t客户端-断点续传"<<"/t 作者:冷风/n/n"<<"请输入保存文件的路径 如 C://Save.RAR /n/n"<<"文件路径: ";
        cin        >>FilePath;
        /*网络参数初示化,详细请参照源代码......*/
        if(connect(client,(SOCKADDR*)&serveraddr,sizeof(serveraddr))==INVALID_SOCKET)
        {
                cout<<"Connect Server Error";
                return 0;
        }
        int FileLen=0;
        int nCurrentPos=0; //断点位置
        UINT OpenFlags;       
        CFile PosFile;
        if(PosFile.Open("PosFile.temp",CFile::modeRead|CFile::typeBinary))//如果有临时文件则读取断点
        {
                PosFile.Read((char*)&nCurrentPos,sizeof(nCurrentPos));        //读取断点位置
                cout<<"The File Pos is "<<nCurrentPos<<"/n";
                nCurrentPos=nCurrentPos+1;                                //从断点的下一块开始
                PosFile.Close();
                send(client,(char*)&nCurrentPos,sizeof(nCurrentPos),0);        //发送断点值
                OpenFlags=CFile::modeWrite|CFile::typeBinary;                //文件为可写
        }
        else
        {
                send(client,(char*)&nCurrentPos,sizeof(nCurrentPos),0);        //无断点文件nCurrentPos为0
                OpenFlags=CFile::modeWrite|CFile::typeBinary|CFile::modeCreate;//创建文件方式
        }
        if(recv(client,(char*)&FileLen,sizeof(FileLen),0)!=0)//接受文件长度
        {
                int                nChunkCount;
                CFile        file;
                nChunkCount=FileLen/CHUNK_SIZE;                //计算文件块数
                if(FileLen%nChunkCount!=0)
                {
                        nChunkCount++;
                }
                if(file.Open(FilePath,OpenFlags))
                {
                        file.Seek(nCurrentPos*CHUNK_SIZE,CFile::begin);        //文件指针移至断点处
                        char *date = new char[CHUNK_SIZE];
                        for(int i=nCurrentPos;i<nChunkCount;i++)        //从断点处开始写入文件
                        {
                                cout<<"Recv The Chunk is "<<i<<"/n";
                                int nLeft;
                                if(i+1==nChunkCount)                                                //最后一块
                                        nLeft=FileLen-CHUNK_SIZE*(nChunkCount-1);
                                else
                                        nLeft=CHUNK_SIZE;
                                int idx=0;
                                while(nLeft>0)
                                {
                                        int ret=recv(client,&date[idx],nLeft,0);
                                        if(ret==SOCKET_ERROR)
                                        {
                                                cout<<"Recv Date Error";
                                                return 0;
                                        }
                                        idx+=ret;
                                        nLeft-=ret;
                                }
                                file.Write(date,CHUNK_SIZE);
                                CFile        PosFile;                //将断点写入PosFile.temp文件
                                int seekpos=i+1;
                                if(PosFile.Open("PosFile.temp",CFile::modeWrite|CFile::typeBinary|CFile::modeCreate));
                                {
                                        PosFile.Write((char*)&seekpos,sizeof(seekpos));
                                        PosFile.Close();
                                }
                        }
                        file.Close();
                        delete[] date;
                }       
                if(DeleteFile("PosFile.temp")!=0)
                {
                        cout<<"文件传输完成";
                }
        }
        return 0;
}
客户端运行时会试图打开临时文件,如果存在则读取断点值,如果不存在则断点为0,打开文件后将文件指针移至断点处开始接受数据,每接受一块就把当前块的数值存入临时文件.其实现代码比较简单结合上面的流程介绍
看代码应该没什么难度,所以我也就不画蛇添足了.

到此文件传输部分就介绍完毕了

 

C++中使用断点写调试方法 收藏
 C/C++ code:
f9 —— 设置/取消断点
f10 —— 单步执行
f11 —— 比f10的步幅小
f10在函数的调用时,直接跳过,在f11下,会进入函数体!
f5 —— 执行到下一个断点!

    了解调试,首先要知道"断点"这个概念。断点就是程序运行中可能会中断的地方,方便开发者在程序运行的过程中查看

程序当前的运行状态,比如变量的值,函数的返回值等等。究竟怎么使用断点呢?
 1.F9在当前光标所在的行下断点,如果当前行已经有断点,则取消断点。
    F5调试状态运行程序,程序执行到有断点的地方会停下来。
    F10单步执行程序。

    CTRL+F10运行到光标所在行。

    F11和F10的区别是,如果当前执行语句是函数调用,则会进入函数里面。

    SHIFT+F11跳出当前所在函数。

    特别说明:

    a.有的地方不能下断点。比如空行,基本类型定义语句(不初始化),等等非执行语句。比如

    int i; // 此行不能下断点

    int j=0;// 这里可以下

    CString str;// 这里可以下

    intk = Max(i,j);// 这里可以下

    b.不是所有断点都会(断)。比如下断点的语句在程序里面没有被执行。

    c.此外,ALT+F9还可以下条件断点,不过这个不常用,有兴趣的可以自己研究

 

2.如何调试Release版的程序?

    有些程序在debug下运行的很好,但在release下却总是失败,默认情况下release是不能调试的。 怎么解决呢?

    其实"debug"和"release"都只是一个代号而已,各自对应一组不同的编译选项。

    在release的默认设置下,ALT+F7 ,调出工程设置对话框,切换到link选项卡,勾选"Generate debug info",然后再切换

到C/C++选项卡,在"Optimizations"里面选"Disable(Debug)",在下面的"Debug info"里面选"Program Database for Edit

and Continue".然后点OK保存设置,重新编译程序,下断点即可。

    3.上面两点已经能应付很多种情况了,但是有时候即使在debug下也不能下断点,我以前也曾经遇到过这种问题,一个

调了层的dll,就是不能下断点。其实还除了上面的方法,还有一种最底层的实现技术:使用汇编。

    细心的人可能会发现,有时候在调试状态下当程序出现异常的时候,光标会指向汇编代码,而这个代码就是int 3,这其

实是一个中断。

    在你的代码的任意地方加上

    __asm

    {

    int 3

    };

    用debug编译,然后直接运行程序。当程序执行到上述代码的时候,就会出现一个框,告诉你说一大堆信息,说程序错

了,下面有"调试"、"终止"、"忽略",不用理,点调试就可以进入跟踪了。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/vacole/archive/2008/12/16/3533500.aspx

 

F9, 插入或删除断点。
F5,进入调试模式运行
F10: step over // 单步
F11: step in // 单步并进入函数

查看变量:在watch里面,输入你的变量名即可。你需要先把程序运行起来,到达你的断点之后,在输入你想观察的变量名。

这些在菜单上面也可以找到相应的项。

一楼的说的是正确的  可以在你想设置断点的地方点击右键 里面有设置断点选项

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值