linux 断点 Linux怎么运行可执行文件

大家好,关于linux 断点很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于Linux怎么运行可执行文件的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

Linux内核:自己动手写一个GDB设置断点(原理篇)

在《自己动手写一个GDB|基础功能》中,我们探讨了使用ptrace()系统调用来实现一个简单进程追踪程序的方法。本文将深入探讨如何实现在GDB中设置断点的功能。断点是什么?当使用GDB调试程序时,若希望在程序执行至特定位置(某行代码)时暂停运行,即可通过在此位置设置断点来实现这一目的。当程序执行至断点位置时,将停止运行。此时,调试者能对进程进行各种调试操作,如查看进程堆栈信息或变量值等。

断点背后的原理与中断密切相关。中断是解决外部设备在完成特定任务后通知CPU的一种机制,如硬盘在完成读写后通过中断向CPU发出已结束信号。中断从物理角度看是一种电信号,由硬件设备产生并直接送入中断控制器(如8259A)的输入引脚,随后由中断控制器向处理器发送相应信号。处理器在接收到该信号后,停止当前任务转而执行中断服务例程。每个中断都通过一个唯一的数字标识,这些值称为中断请求线。

当进程在运行过程中遇到中断时,CPU会停止当前进程的执行,转而运行内核设置的中断服务例程。这为调试进程提供了机会,如打印变量值或堆栈信息。在中断原理基础上,本文将介绍如何利用软中断功能实现断点设置。软中断与硬中断类似,但其触发是通过特殊指令int3实现的,该指令的十六进制代码为0xcc。当CPU执行到int3指令时,会停止运行当前进程,并调用内核定义的int3中断处理例程(do_int3)。do_int3会向进程发送SIGTRAP信号,调试进程接收到该信号后停止执行,以便进行调试操作。

设置断点的目标是让进程暂停运行,从而实现调试。接下来,我们将讨论设置断点的具体方法。我们知道,当CPU遇到int3指令(0xcc)时会停止当前进程。因此,只需在需要设置断点的位置替换为int3指令即可。但设置时还需保存原指令,以便调试完成后恢复程序正常运行。

本文的实现步骤包括创建、启用、禁用和释放断点。首先,定义一个用于保存断点前信息的breakpoint_context结构体。接着,实现创建、启用、禁用和释放断点的辅助函数。创建断点时,通过malloc申请breakpoint_context结构,并设置地址和数据字段。启用断点涉及读取断点位置数据、保存到data字段,并将指令替换为int3。禁用断点则将指令替换回原值。释放断点仅需释放占用的内存。

总结,本文为断点设置的原理篇。下篇将介绍如何结合上述原理和辅助函数实现断点功能,敬请期待。原文链接:Linux内核:自己动手写一个GDB设置断点(原理篇)- Linux内核-我爱内核网。

Linux下实现断点续传的原理介绍

断点续传是一种结合本地存储和网络存储的技术,主要用来解决网络失效时的视频丢失问题。DVS通常本身没有视频存储功能,而是必须由后端的NVR来实现视频的存储,因此对于网络稳定性要求很高,网络连接失败、丢包严重、抖动等各种因素都可能造成视频数据的丢失。断点续传支持从文件上次中断的地方开始传送数据,而并非是从文件开头传送。这就是断点续传的定义。系统都默认可以断点续传,但我们很少知道他的原理,下面就来看看小编的介绍吧。

   断点续传的原理

其实断点续传的原理很简单,就是在 Http的请求上和一般的下载有所不同而已。

打个比方,浏览器请求服务器上的一个文时,所发出的请求如下:

假设服务器域名为 wwww.sjtu.edu.cn,文件名为 down.zip。

GET/down.zip HTTP/1.1

Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-

excel, application/msword, application/vnd.ms-powerpoint,*/*

Accept-Language: zh-cn

Accept-Encoding: gzip, deflate

User-Agent: Mozilla/4.0(compatible; MSIE 5.01; Windows NT 5.0)

Connection: Keep-Alive

服务器收到请求后,按要求寻找请求的文件,提取文件的信息,然后返回给浏览器,返回信息如下:

200

Content-Length=106786028

Accept-Ranges=bytes

Date=Mon, 30 Apr 2001 12:56:11 GMT

ETag=W/“02ca57e173c11:95b”

Content-Type=application/octet-stream

Server=Microsoft-IIS/5.0

Last-Modified=Mon, 30 Apr 2001 12:56:11 GMT

所谓断点续传,也就是要从文件已经下载的地方开始继续下载。所以在客户端浏览器传给 Web服务器的时候要多加一条信息--从哪里开始。

下面是用自己编的一个“浏览器”来传递请求信息给 Web服务器,要求从 2000070字节开始。

GET/down.zip HTTP/1.0

User-Agent: NetFox

RANGE: bytes=2000070-

Accept: text/html, image/gif, image/jpeg,*; q=.2,*/*; q=.2

仔细看一下就会发现多了一行 RANGE: bytes=2000070-

这一行的意思就是告诉服务器 down.zip这个文件从 2000070字节开始传,前面的字节不用传了。

服务器收到这个请求以后,返回的信息如下:

206

Content-Length=106786028

Content-Range=bytes 2000070-106786027/106786028

Date=Mon, 30 Apr 2001 12:55:20 GMT

ETag=W/“02ca57e173c11:95b”

Content-Type=application/octet-stream

Server=Microsoft-IIS/5.0

Last-Modified=Mon, 30 Apr 2001 12:55:20 GMT

和前面服务器返回的信息比较一下,就会发现增加了一行:

Content-Range=bytes 2000070-106786027/106786028

返回的代码也改为 206了,而不再是 200了。

知道了以上原理,就可以进行断点续传的编程了。

Java实现断点续传的关键几点

(1)用什么方法实现提交 RANGE: bytes=2000070-。

当然用最原始的 Socket是肯定能完成的,不过那样太费事了,其实 Java的 net包中提供了这种功能。代码如下:

URL url= new URL(“”);

HttpURLConnection httpConnection=(HttpURLConnection)url.openConnection();

//设置 User-Agent

httpConnection.setRequestProperty(“User-Agent”,“NetFox”);

//设置断点续传的开始位置

httpConnection.setRequestProperty(“RANGE”,“bytes=2000070”);

//获得输入流

InputStream input= httpConnection.getInputStream();

从输入流中取出的字节流就是 down.zip文件从 2000070开始的字节流。大家看,其实断点续传用 Java实现起来还是很简单的吧。接下来要做的事就是怎么保存获得的流到文件中去了。

保存文件采用的方法。

我采用的是 IO包中的 RandAccessFile类。

操作相当简单,假设从 2000070处开始保存文件,代码如下:

RandomAccess oSavedFile= new RandomAccessFile(“down.zip”,“rw”);

long nPos= 2000070;

//定位文件指针到 nPos位置

oSavedFile.seek(nPos);

byte[] b= new byte[1024];

int nRead;

//从输入流中读入字节流,然后写到文件中

while((nRead=input.read(b,0,1024))》 0)

{

oSavedFile.write(b,0,nRead);

}

以上就是断点续传的原理,知道这些原理,相信大家都能够进行编程了吧,这个技术在现在的电脑技术上也算不得什么,打家应该都注意到我们下载时都是断点续传吧

linux os下GDB调试-条件断点、观察点、捕捉点

在Linux OS下的GDB调试中,利用条件断点、观察点和捕捉点实现程序的精准控制。

条件断点允许您指定断点仅在满足特定条件时触发。使用"if"关键词结合断点条件,如"condition 1 i== 5",表示当变量 i等于 5时,程序才会在此处暂停执行。

对于需要忽略特定条件触发次数的场景,可以使用"ignore"命令,例如"ignore 10 bnum",表示在断点编号为 bnum的情况下忽略停止条件 10次。

观察点功能则允许程序在特定表达式值发生变化时暂停执行,如"watch expr"。使用"delete"删除指定的观察点,"rwatch"在表达式被读取时暂停,"awatch"则在表达式值被读取或写入时暂停程序。

捕捉点机制用于捕获程序运行过程中的特定事件,例如程序加载共享库(动态链接库)或 C++异常处理。通过"catch"命令设置,如"catch event commands",实现对这些事件的精确控制。

这些调试工具的巧妙使用,极大提高了在Linux环境下的程序调试效率,帮助开发者精准定位和解决程序中的问题。

阅读剩余
THE END