1.使用#39print#39语句
这是调试问题的基本方法。我们在程序中可疑的地方插入print语句,了解程序的运行过程,控制流和变量值的变化。
它的缺点是需要编辑程序,添加#39print#39语句,并且必须重新编译重新运行才能得到输出。如果要调试的程序很大,这将是一个费时费力的方法。
2、使用查询
在某些情况下,我们需要了解内核中运行的进程的状态和内存映射。为了获得这一信息,我们不不需要在内核中插入任何代码。相反,您可以使用/proc文件系统。在/proc的伪文件系统中,运行信息(cpu信息、内存容量等。)在系统开始运行时收集的数据被保留。
对于系统中运行的每个进程,ls-l/proc的输出结果有一个以/proc文件系统中的进程id命名的项。每个进程的详细信息可以在进程id对应的目录下的文件中获得。您也可以输出#39ls/proc/pid#39。
免费视频教程推荐:linux视频教程
3.使用跟踪
strace和ltrace是linux中用来跟踪程序执行细节的两个跟踪工具。
strac:
strace截获并记录系统调用和它接收到的信号。对于用户,它显示系统调用、传递给它们的参数和返回值。strace可以附加到已经运行的进程或新进程。作为开发人员和系统管理员的诊断和调试工具,它非常有用。
它还可以作为一种工具,通过跟踪不同的程序调用来了解系统。这个工具的优点是不需要源代码,程序也不需要重新编译。
使用strace的基本语法是:
斯特拉思的输出很长,所以我们通常对显示的每一行都不感兴趣。我们可以使用#39-eexpr#39选项来过滤不需要的数据。
使用#39-ppid#39选项绑定到正在运行的进程。
使用#39-o#39选项,可以将命令的输出重定向到一个文件。
strace只过滤系统调用的输出。
ltrac:
ltrace跟踪并记录进程的调用。;的动态(运行时)库和它接收的信号。它还可以跟踪进程发出的系统调用。其用法类似于strace。
#39-i#39选项在调用库时打印指令指针。
#39-s#39选项用于实现系统调用和库调用。
trace捕获#39strcmp#39库调用的输出。
相关文章教程推荐:linux教程
那个李nux中程序调试的方法有哪些细节?
进程调度策略是调度系统将在cpu上运行哪个进程。
这种调度分两层考虑。
第一级,进程状态,是最高优先级,即最高优先级。
在linux中,只有处于就绪状态的进程可以被调度和选择然后占用cpu,其他状态的进程不能占用cpu。
下面是进程在linux中的状态:task_running:就绪状态,当你得到cpu后就可以运行它了。
task_int:;■浅睡眠时,资源到位或收到信号就会变得准备就绪。
task_unint:进入深度睡眠,当资源到位时,他将进入就绪状态,不会响应信号。
task_zombie:dead状态,进程退出后。
task_stopped:暂停状态,收到sig_cont信号后的就绪状态。
第二层,实际上是在操作系统中实现的,就是把所有准备好的进程链接成一个队列,调度进程时只考虑这个队列中的进程,不考虑其他进程,实现了第一层中的要求。
下一步是就绪队列中的进程之间的竞争。
linux采用三种不同的调度策略,sched_fifo(以下简称fifo,先来先服务),sched_rr(以下简称rr,时间片轮换)和sched_other(以下简称other)。
在这里,你可以看到一个问题。具有相同调度策略的进程自然具有可比性,linux3的三种调度策略并存。那么采用不同调度策略的进程如何比较呢?可以说两者没有可比性。
其实调度的时候,调度只看一个指标,就是每个进程的权重,权重最大,在可执行队列中排名第一的,就会被调度执行。
但是权重的计算会设计到各种因素,其中调度策略可以说是权重计算中最重的。
linux为什么要这么做?这是由交易的多样性决定的。有两种进程:实时进程和非实时进程。fifo和rr用于支持实时进程的调度。让s来看看fifo和rr这三种策略下权重的计算公式,以及权重为1000的进程实际运行时间的计算公式。当时间片为0时,权重为0。当时间片不为0时,权重的剩余时间片为20-nice,同时,如果内核线程有一个小的奖金1,这是因为内核线程没有t不需要切换用户空间,所以给它一个奖励,奖励他在切换过程中的低开销。
时间电影很容易理解,很好这个值,用过linux系统的人都知道,是从unix继承来的概念,表示谦逊,是20到-19的数字,可以通过nice和renice指令设置。
从代码中也可以看出,值越小,对别人就越不谦逊。
由此我们可以看出,fifo和rr至少有1000个基数,所以当有fifo和rr调度策略进程时,其他进程就没有机会被调度了。
同时,从权重计算公式中可以看出,fifo先来先服务调度策略得到满足,但是rr,时间片轮换的调度,如果按照这个权重计算,就不能满足时间片轮换的概念。
这里只是权重的计算,rr策略的流程在调度时有特殊处理。
以上都是重量计算。让让我们来看看真正的日程安排过程。首先,它是rr策略过程的特殊处理。如果当前进程采用rr策略,就要看他的时间片是否用完。当它用完时,它将被踢到就绪队列的末尾,他的时间片将被恢复。
然后便于整个就绪队列找到权重最大的第一个进程运行。
总体的调度效果是,如果有带fifo和rr策略的进程,就先调度,两者之间的时间长短决定胜负,而两个策略遵守各自的调度策略。
其他只有在前两种在就绪队列中不存在时才能执行。他们其实是轮流执行的,但是他们之间的胜负取决于剩余时间和nice值。
同时,就绪队列中的最高优先级被赋予相同的权重。