当前位置:文档之家› 浅谈LLDB调试器

浅谈LLDB调试器

浅谈LLDB调试器
浅谈LLDB调试器

随着Xcode 5的发布,LLDB调试器已经取代了GDB,成为了Xcode工程中默认的调试器。它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能。LLDB为Xcode提供了底层调试环境,其中包括内嵌在Xcode IDE中的位于调试区域的控制面板,在这里我们可以直接调用LLDB命令。如图1所示:图1:位于Xcode调试区域的控制台

在本文中,我们主要整理一下LLDB调试器提供给我们的调试命令,更详细的内容可以查看The LLDB Debugger。LLDB命令结构

在使用LLDB前,我们需要了解一下LLDB的命令结构及语法,这样可以尽可能地挖掘LLDB的潜能,以帮助我们更充分地利用它。

LLDB命令的语法有其通用结构,通常是以下形式的:

[[...]][-options[option-value]][argument[a rgument...]]其中:

(命令)和(子命令):LLDB调试命令的名称。命令和子命令按层级结构来排列:一个命令对象为跟随其的子命令对象创建一个上下文,子命令又为其子命令创建一个上下文,依此类推。

:我们想在前面的命令序列的上下文中执行的一些操作。

:行为修改器(action modifiers)。通常带有一些值。

:根据使用的命令的上下文来表示各种不同的东西。

LLBD命令行的解析操作在执行命令之前完成。上面的这些元素之间通过空格来分割,如果某一元素自身含有空格,则可以使用双引用。而如果元素中又包含双引号,则可以使用反斜杠;或者元素使用单引号。如下所示:

(lldb)command[subcommand]-option”so me\”quoted\”string”(lldb)command[subc ommand]-option'some”quoted”strin g'这种命令解析设计规范了LLDB命令语法,并对所有命令做了个统一。

命令选项

LLDB中的命令选项有规范形式和缩写形式两种格式。以设置断点的命令breakpoint set为例,以下列表了其部分选项的格式,其中括号中的是规范形式:breakpointset-M(--method)-S(--selector)-b(--basename)-f(--file)-l(--line)-n(--name)…各选项的顺序是任意的。如果后面的参数是以”–“开头的,则在选项后面添加”—“作为选项的终止信号,以告诉LLDB我们处理的选项的正确位置。如下命令所示:

(lldb)processlaunch--stop-at-entry---prog ram_arg_1value-program_arg_2value如上所示,命令的选项是—stop-at-entry,参数是-program_arg_1和-program_arg_2,我们使用”—“将选项与参数作一下区分。

原始命令

LLDB命令解析器支持”原始(raw)“命令,即没有命令选项,命令字符串的剩余部分未经解析就传递给命令。例如,

expression就是一个原始命令。

不过原始命令也可以有选项,如果命令字符串中有虚线,则在命令名与命令字符串之间放置一个选项结束符(—)来表明没有命令标记。

我们可以通过help命令的输出来查看一个命令是否是原始命令。

命令补全(Command Completion)

LLDB支持源文件名,符号名,文件名,等等的命令补全(Commmand Completion)。终端窗口中的补全是通过在命令行中输入一个制表符来初始化的。Xcode控制台中的补全与在源码编辑器中的补全方式是一样的:补全会在第三个字符被键入时自动弹出,或者通过Esc键手动弹出。

一个命令中的私有选项可以有不同的完成者(completers)。如breakpoint中的—file 选项作为源文件的完成者,—shlib 选项作为当前加载的库的完成者,等等。这些行为是特定的,例如,如果指定—shlib ,且以—file 结尾,则LLDB只会列

出由—shlib 指定的共享类库。Python脚本

对于高级用户来说,LLDB有一个内置的Python解析器,可以通过脚本命令来访问。调试器中的所有特性在Python解析器中都可以作为类来访问。这样,我们就可以使用LLDB-Python库来写Python 函数,并通过脚本将其加载到运行会话中,以执行一些更复杂的调试操作。

在命令行中调试程序

通常我们都是在Xcode中直接使用LLDB调试器,Xcode会帮我们完成很多操作。当然,如果我们想让自己看着更Bigger,或者想了解下调试器具体的一些流程,就可以试试直接在终端使用LLDB 命令来调试程序。在终端中使用LLDB调试器,我们需要了解以下内容:

1.加载程序以备调试

2.将一个运行的程序绑定到LLDB

3.设置断点和观察点

4.控制程序的执行

5.在调试的程序中导航

6.检查状态和值的变量

7.执行替代代码

了解在终端中这些操作是如何进行的,可以帮助我们更深入的了解调试器在Xcode中是如何运作的。下面我们分步来介绍一下。

指定需要调试的程序

首先我们需要设置需要调试的程序。我们可以使用如下命令做到这一点:$lldb/Projects/Sketch/build/Debug/Sketc h.appCurrentexecutablesetto'/Projec ts/Sketch/build/Debug/Sketch.app'(x 86_64).或者在运行lldb后,使用file命令来处理,如下所示:

$lldb(lldb)file/Projects/Sketch/build/Deb ug/Sketch.appCurrentexecutablesetto 9;/Projects/Sketch/build/Debug/Sketch.ap p'(x86_64).设置断点

在设置完程序后,我们可能想设置一点断点来调试程序。此时我们可以使用breakpoint set命令来设置断点,这个命令简单、直观,且有智能补全,接下来

我们看看它的具体操作。

如果想在某个文件中的某行设置一个断点,可使用以下命令:

(lldb)breakpointset--filefoo.c--line12如果想给某个函数设置断点,可使用以下命令:

(lldb)breakpointset--namefoo如果想给C++中所有命名为foo的方法设置断点,可以使用以下命令:

(lldb)breakpointset--methodfoo如果想给Objective-C中所有命名为alignLeftEdges:的选择器设置断点,则可以使用以下命令:

(lldb)breakpointset--selectoralignLeftEdg es:我们可以使用—shlib 来将断点限定在一个特定的可执行库中:

(lldb)breakpointset--shlibfoo.dylib--name foo看吧,断点设置命令还是很强大的。如果我们想查看程序中所有的断点,则可以使用breakpoint list命令,如下所示:(lldb)breakpointlistCurrentbreakpoints:1: name='alignLeftEdges:',locatio

ns=1,resolved=11.1:where=Sketch`-[SKTGr aphicViewalignLeftEdges:]+33at/Projects/ Sketch/SKTGraphicView.m:1405,address= 0x0000000100010d5b,resolved,hitcount= 0从上面的输出结果可以看出,一个断点一般有两部分:

1.断点的逻辑规范,这一部分是用户提供给breakpoint set命令的。

2.与规范匹配的断点的位置。

如上所示,通过”breakpoint set —selector alignLeftEdges:“设置的断点,其信息中会显示出所有alignLeftEdges:方法的位置。

breakpoint list命令输出列表显示每个逻辑断点都有一个整数标识,如上所示断点标识为1。而每个位置也会有一个标识,如上所示的1.1。

输出列表中另一个信息是断点位置是否是已解析的(resolved)。这个标识表示当与之相关的文件地址被加载到程序进行调试时,其位置是已解析的。例如,如果在共享库中设置的断点之后被卸载

了,则断点的位置还会保留,但其不能再被解析。

不管是逻辑断点产生的所有位置,还是逻辑断点解析的任何特定位置,我们都可以使用断点触发命令来对其进行删除、禁用、设置条件或忽略计数操作。例如,如果我们想添加一个命令,以在LLDB命中断点1.1时打印跟踪栈,则可以执行以下命令

(lldb)breakpointcommandadd1.1Enteryo urdebuggercommand(s).Type'DONE 'toend.>bt>DONE如果想更详细地了解”breakpoint command add”命令的使用,可以使用help帮助系统来查看。设置观察点

作为断点的补充,LLDB支持观察点以在不中断程序运行的情况下监测一些变量。例如,我们可以使用以下命令来监测名为global的变量的写操作,并在(global==5)为真时停止监测:

(lldb)watchsetvarglobalWatchpointcreate d:Watchpoint1:addr=0x100001018size=4s

tate=enabledtype=wdeclare@'/Volu mes/data/lldb/svn/ToT/test/functionalitie s/watchpoint/watchpoint_commands/con dition/main.cpp:12'(lldb)watchmodif y-c'(global==5)'(lldb)watchlistC urrentwatchpoints:Watchpoint1:addr=0x1 00001018size=4state=enabledtype=wdecl are@'/Volumes/data/lldb/svn/ToT/te st/functionalities/watchpoint/watchpoint_ commands/condition/main.cpp:12'c ondition='(global==5)'(lldb)cPr ocess15562resuming(lldb)abouttowriteto 'global'...Process15562stopped andwasprogrammaticallyrestarted.Process 15562stoppedandwasprogrammaticallyres tarted.Process15562stoppedandwasprogr ammaticallyrestarted.Process15562stoppe dandwasprogrammaticallyrestarted.Proce ss15562stopped*thread#1:tid=0x1c03,0x0 000000100000ef5a.out`modify+21atmain. cpp:16,stopreason=watchpoint1frame#0:0 x0000000100000ef5a.out`modify+21atma

in.cpp:161314staticvoidmodify(int32_t&v ar){15++var;->16}1718intmain(intargc,cha r**argv){19intlocal=0;(lldb)bt*thread#1:ti d=0x1c03,0x0000000100000ef5a.out`mod ify+21atmain.cpp:16,stopreason=watchpo int1frame#0:0x0000000100000ef5a.out` modify+21atmain.cpp:16frame#1:0x0000 000100000eaca.out`main+108atmain.cpp: 25frame#2:0x00007fff8ac9c7e1libdyld.dyl ib`start+1(lldb)framevarglobal(int32_t)glo bal=5(lldb)watchlist-vCurrentwatchpoints: Watchpoint1:addr=0x100001018size=4sta te=enabledtype=wdeclare@'/Volum es/data/lldb/svn/ToT/test/functionalities/ watchpoint/watchpoint_commands/condi tion/main.cpp:12'condition='(g lobal==5)'hw_index=0hit_count=5ig nore_count=0(lldb)可以使用help watchpoint来查看该命令的使用。

使用LLDB来启动程序

一旦指定了调试哪个程序,并为其设置了一些断点后,就可以开始运行程序了。

我们可以使用以下命令来启动程序:(lldb)processlaunch(lldb)run(lldb)r我们同样可以使用进程ID或进程名来连接一个已经运行的程序。当使用名称来连接一个程序时,LLDB支持—waitfor选项。这个选项告诉LLDB等待下一个名称为指定名称的程序出现,然后连接它。例如,下面3个命令都是用于连接Sketch程序(假定其进程ID为123):

(lldb)processattach--pid123(lldb)process attach--nameSketch(lldb)processattach--n ameSketch--waitfor启动或连接程序后,进程可能由于某些原因而停止,如:(lldb)processattach-p12345Process46915 AttachingProcess46915Stopped1of3threa dsstoppedwithreasons:*thread#1:tid=0x2 c03,0x00007fff85cac76a,where=libSystem.

B.dylib`__getdirentries64+10,stopreason= signal=SIGSTOP,queue=com.apple.main-th read注意“1 of 3 threads stopped with reasons:”及其下面一行。在多线程环境下,在内核实际返回控制权给调试器前,

可能会有多个线程命中同一个断点。在这种情况下,我们可以在停止信息中看到所有因此而停止的线程。

控制程序

启动程序后,LLDB允许程序在到达断点前继续运行。LLDB中流程控制的命令都在thread命令层级中。如下所示:(lldb)threadcontinueResumingthread0x2 c03inprocess46915Resumingprocess4691 5另外,还有以下命令:

(lldb)threadstep-in//Thesameas”step”or”s”inGDB.(lldb)threadstep-over//Thesamea s”next”or”n”inGDB.(lldb)threadstep-out// Thesameas”finish”or”f”inGDB.(lldb)thread step-inst//Thesameas”stepi”/”si”inGDB.(ll db)threadstep-over-inst//Thesameas”next i”/”ni”inGDB.LLDB还提供了run until line 按步调度模式,如:

lldb)threaduntil100这条命令会运行线程,直到当前frame到达100行。如果代码在运行的过程中跳过了100行,则当frame被弹出栈后终止执行。

查看线程状态

在进程停止后,LLDB会选择一个当前线程和线程中当前帧(frame)。很多检测状态的命令可以用于这个线程或帧。

为了检测进程的当前状态,可以从以下命令开始:

(lldb)threadlistProcess46915stateisStopp ed*thread#1:tid=0x2c03,0x00007fff85cac 76a,where=libSystem.B.dylib`__getdirentri es64+10,stopreason=signal=SIGSTOP,queu e=com.apple.main-threadthread#2:tid=0x 2e03,0x00007fff85cbb08a,where=libSyste m.B.dylib`kevent+10,queue=com.apple.lib dispatch-managerthread#3:tid=0x2f03,0x0 0007fff85cbbeaa,where=libSystem.B.dylib `__workq_kernreturn+10星号(*)表示thread #1为当前线程。为了获取线程的跟踪栈,可以使用以下命令:

(lldb)threadbacktracethread#1:tid=0x2c0 3,stopreason=breakpoint1.1,queue=com.a pple.main-threadframe#0:0x00000001000 10d5b,where=Sketch`-[SKTGraphicViewali

gnLeftEdges:]+33at/Projects/Sketch/SKTGr aphicView.m:1405frame#1:0x00007fff860 2d152,where=AppKit`-[NSApplicationsend Action:to:from:]+95frame#2:0x00007fff86 0516be,where=AppKit`-[NSMenuItem_cor ePerformAction]+365frame#3:0x00007fff8 6051428,where=AppKit`-[NSCarbonMenuI mplperformActionWithHighlightingForIte mAtIndex:]+121frame#4:0x00007fff86037 0c1,where=AppKit`-[NSMenuperformKeyE quivalent:]+272frame#5:0x00007fff86035 e69,where=AppKit`-[NSApplication_handl eKeyEquivalent:]+559frame#6:0x00007fff 85f06aa1,where=AppKit`-[NSApplications endEvent:]+3630frame#7:0x00007fff85e9 d922,where=AppKit`-[NSApplicationrun]+ 474frame#8:0x00007fff85e965f8,where=A ppKit`NSApplicationMain+364frame#9:0x 0000000100015ae3,where=Sketch`main+ 33at/Projects/Sketch/SKTMain.m:11frame #10:0x0000000100000f20,where=Sketch`s tart+52如果想查看所有线程的调用栈,

则可以使用以下命令:

(lldb)threadbacktraceall查看调用栈状态

检查帧参数和本地变量的最简便的方式是使用frame variable命令:

(lldb)framevariableself=(SKTGraphicView *)0x0000000100208b40_cmd=(structobjc _selector*)0x000000010001bae1sender=( id)0x00000001001264e0selection=(NSArr ay*)0x00000001001264e0i=(NSUInteger)0 x00000001001264e0c=(NSUInteger)0x000 00001001253b0如果没有指定任何变量名,则会显示所有参数和本地变量。如果指定参数名或变量名,则只打印指定的值。如:

(lldb)framevariableself(SKTGraphicView* )self=0x0000000100208b40frame variable 命令不是一个完全的表达式解析器,但它支持一些简单的操作符,如&,*,–>,[]。这个数组括号可用于指针,以将指针作为数组处理。如下所示:

(lldb)framevariable*self(SKTGraphicView

*)self=0x0000000100208b40(NSView)NSV iew={(NSResponder)NSResponder={...(lldb )framevariable&self(SKTGraphicView**)& self=0x0000000100304ab(lldb)framevaria bleargv[0](charconst*)argv[0]=0x00007fff 5fbffaf8”/Projects/Sketch/build/Debug/Sk etch.app/Contents/MacOS/Sketch”frame variable命令会在变量上执行”对象打印”操作。目前,LLDB只支持Objective-C 打印,使用的是对象的description方法。如果想查看另外一帧,可以使用frame select命令,如下所示:

(lldb)frameselect9frame#9:0x000000010 0015ae3,where=Sketch`function1+33at/Pr ojects/Sketch/SKTFunctions.m:11小结

以上所介绍的命令可以让我们在终端中直接调试程序。当然,很多命令也可以在Xcode中直接使用。这些命令可以让我们了解程序运行的状态,当然有些状态可以在Xcode中了解到。建议在调试过程中,可以多使用这些命令。

如果想了解这一过程中使用的各种命

令,可以查看苹果的官方文档。

在Xcode中调试程序

对于我们日常的开发工作来说,更多的时候是在Xcode中进行调试工作。因此上面所描述的流程,其实Xcode已经帮我们完成了大部分的工作,而且很多东西也可以在Xcode里面看到。因此,我们可以把精力都集中在代码层面上。

在苹果的官方文档中列出了我们在调试中能用到的一些命令,我们在这重点讲一些常用的命令。

打印

打印变量的值可以使用print命令,该命令如果打印的是简单类型,则会列出简单类型的类型和值。如果是对象,还会打印出对象指针地址,如下所示:(lldb)printa(NSInteger)$0=0(lldb)printb(N SInteger)$1=0(lldb)printstr(NSString*)$2= 0x0000000100001048@”abc”(lldb)printur l(NSURL*)$3=0x0000000100206cc0@”abc ”在输出结果中我们还能看到类似于$0,$1这样的符号,我们可以将其看作是

指向对象的一个引用,我们在控制面板中可以直接使用这个符号来操作对应的对象,这些东西存在于LLDB的全名空间中,目的是为了辅助调试。如下所示:(lldb)exp$0=100(NSInteger)$9=100(lldb) pa(NSInteger)$10=100另外$后面的数值是递增的,每打印一个与对象相关的命令,这个值都会加1。

上面的print命令会打印出对象的很多信息,如果我们只想查看对象的值的信息,则可以使用po(print object的缩写)命令,如下所示:

(lldb)postrabc当然,po命令是”exp -O —“命令的别名,使用”exp -O —”能达到同样的效果。

对于简单类型,我们还可以为其指定不同的打印格式,其命令格式是print/,如下所示:

(lldb)p/xa(NSInteger)$13=0x0000000000 000064格式的完整清单可以参考Output Formats。

expression

在开发中,我们经常会遇到这样一种情况:我们设置一个视图的背景颜色,运行后发现颜色不好看。嗯,好吧,在代码里面修改一下,再编译运行一下,嗯,还是不好看,然后再修改吧~~这样无形中浪费了我们大把的时间。在这种情况下,expression命令强大的功能就能体现出来了,它不仅会改变调试器中的值,还改变了程序中的实际值。我们先来看看实际效果,如下所示:

(lldb)expa=10(NSInteger)$0=10(lldb)expb =100(NSInteger)$1=1002015-01-2514:00: 41.313test[18064:71466]a+b=110,abcexpr ession命令的功能不仅于此,正如上面的po命令,其实际也是”expression -O —“命令的别名。更详细使用可以参考Evaluating Expressions。

image

image命令的用法也挺多,首先可以用它来查看工程中使用的库,如下所示:(lldb)imagelist[0]432A6EBF-B9D2-3850-B CB2-821B9E62B1E00x0000000100000000

电路图、工作原理、调试步骤

1、稳压电源电路图、工作原理、调试步骤 a)仪器的准备 1、调压器 2、变压器 3、指针万用表(2.5A插孔) 4、数字万用表 5、负载电阻12Ω/25W 6、电子电压表 b)电路的功能 该电路是一个串联形直流稳压电路,它是由电源变换电路、整流电路、滤波电路、稳压电路和负载组成。该电路可以实现整流、滤波、稳压。其中稳压部分包括基准电压、取样电路、比较放大器、调整电路等。 c)电路原理图 d)电路的原理 ◆稳压的工作原理 稳压电路是利用负反馈的原理,以输出电压的变化量ΔUL,经取样管VT3与基准电压7.5V(VD5稳压管提供)比较放大后,去控制调整管VT2的基极电流Ib,当Ib增大,调整管Uce将减小;当Ib减小,调整管Uce将增大;使输出电压UL基本保持不变。 当电网电压升高或输出电流减小时: Uo↑→Ub(VT3)↑→Ube(VT3)↑→Ic(VT3)↑→Uc(VT3)↓→Ub(VT1)↓→Ic(VT1)↓→Ic(VT2)↓→Uce(VT2) ↑→Uo↓ 当电网电压下降或输出电流变大时: Uo↓→Ub(VT3) ↓→Ube(VT3) ↓→Ic(VT3) ↓→Uc(VT3) ↑→Ub(VT1) ↑→Ic(VT1) ↑→Ic(VT2) ↑→Uce(VT2) ↓→Uo↓ ◆说明各元件在电路中的作用 VD1、VD2、VD3、VD4桥式整流电路。C6、C7、C8、C9滤波电容、保护整流二极管。VT1、VT2组成复合管,增大等效β值改善稳压性能。C1、C2、C3、C4、C5为滤波电容。R5为VD5限流电阻。R4给VT1的反向穿透电流提供一条通路,防止高温时,VT2出现失控。R8、RP1、R7为VT3分压偏置电阻。R1、R3为VT2负载电阻。R2、R6、R9为VT1偏置、负载电阻。 e)电路的测量步骤

硬件故障诊断指导和软件调试工具

硬件故障诊断指导和软件调试工具STEP7--Micro/WIN提供软件工具帮助您调试和测试您的程序。这些特征包括:监视S7--200正在执行的用户程序状态,为S7--200指定运行程序的扫描次数,强制变量值等。 使用表8-1作为S7--200硬件故障诊断和找到解决方案的指导。 本章内容: ................................................................... 调试应用程序244 ................................................................... 显示程序状态246 ........................................... 使用状态图来显示和修改S7--200中的数据247 ..................................................................... 强制指定值248 ........................................................ 指定程序执行的扫描周期数248 ................................................................ 硬件故障诊断指导249 243

S7-200可编程控制器系统手册 244 调试应用程序 STEP 7--Micro/WIN 为帮助用户调试程序提供了多种手段:书签,交叉参考表,运行模式下编辑。 使用书签使编程更方便 您在程序中可以使用书签,它可以使您在一个很长的程序中,很方便的在编辑行之间前后移动。您可以移动到程序的下一个标签行或前一个标签行。 使用交叉参考表来检查应用程序 交叉参考表中能够显示应用程序中的交叉参考和元件使用信息。 交叉参考表能够识别程序中使用的所有操作数;程序块、程序段或者程序行的位置以及每一块使用该操作数的相关指令。您可以在符号地址和绝对地址之间切换来改变所有操作数的表现形式。 图8-1交叉参考表 在RUN 模式下编辑应用程序 S7--200CPU Rel.2.0及CPU Rel.2.0以上的CPU 模块支持RUN 模式下编辑的功能。RUN 模式下编辑功能可以在对控制过程影响较小的情况下,对用户程序进行少量修改。该功能也能使您对程序进行大量的改动,但这样做对程序的执行影响较大,甚至是危险的。 警告 当在RUN 模式下向S7--200下载修改过的程序时,修改的程序将立即影响过程操作。在RUN 模式下修改程序会导致不可预见的系统操作,可能会导致严重的人身伤害和财产损失。 只有了解RUN 模式下修改程序对系统运行会造成何种影响的被授权人员,才可以执行在RUN 模式下编辑程序。 要在RUN 模式下编辑应用程序,在线的S7--200CPU 必须支持RUN 模式下编辑,并且该CPU 必须处于RUN 状态。1.在命令菜单中选择Debug >Program Edit in RUN 。 2.如果您打开的项目与S7--200中的程序不同,将提示您存盘。RUN 模式下编辑功能只能编辑CPU 中的程序。 3. STEP 7--Micro/WIN 对于您将在RUN 模式下编辑程序提出警告,提示您是继续下一步还是取消操作。如果您选择继续,STEP 7--Micro/WIN 会在S7--200中上载程序。现在您可以在RUN 模式下编辑程序了。编辑中没有严格的限定。 交叉参考

调试器工作原理探究系列第三篇

本文是调试器工作原理探究系列的第三篇,在阅读前请先确保已经读过本系列的第一和第二篇。 本篇主要内容 在本文中我将向大家解释关于调试器是如何在机器码中寻找C 函数以及变量的,以及调试器使用了何种数据能够在C源代码的行号和机器码中来回映射。 调试信息 现代的编译器在转换高级语言程序代码上做得十分出色,能够将源代码中漂亮的缩进、嵌套的控制结构以及任意类型的变量全都转化为一长串的比特流——这就是机器码。这么做的唯一目的就是希望程序能在目标CPU上尽可能快的运行。大多数的C代码都被转化为一些机器码指令。变量散落在各处——在栈空间里、在寄存器里,甚至完全被编译器优化掉。结构体和对象甚至在生成的目标代码中根本不存在——它们只不过是对内存缓冲区中偏移量的抽象化表示。 那么当你在某些函数的入口处设置断点时,调试器如何知道该在哪里停止目标进程的运行呢?当你希望查看一个变量的值时,调试器又是如何找到它并展示给你呢?答案就是——调试信息。 调试信息是在编译器生成机器码的时候一起产生的。它代表着可执行程序和源代码之间的关系。这个信息以预定义的格式进行编码,并同机器码一起存储。许多年以来,针对不同的平台和可执行文件,人们发明了许多这样的编码格式。由于本文的主要目的不是介绍这些格式的历史渊源,而是为您展示它们的工作原理,所以我们只介绍一

种最重要的格式,这就是DWARF。作为Linux以及其他类Unix平台上的ELF可执行文件的调试信息格式,如今的DWARF可以说是无处不在。 ELF文件中的DWARF格式 根据维基百科上的词条解释,DWARF是同ELF可执行文件格式一同设计出来的,尽管在理论上DWARF也能够嵌入到其它的对象文件格式中。 DWARF是一种复杂的格式,在多种体系结构和操作系统上经过多年的探索之后,人们才在之前的格式基础上创建了DWARF。它肯定是很复杂的,因为它解决了一个非常棘手的问题——为任意类型的高级语言和调试器之间提供调试信息,支持任意一种平台和应用程序二进制接口(ABI)。要完全解释清楚这个主题,本文就显得太微不足道了。说实话,我也不理解其中的所有角落。本文我将采取更加实践的方法,只介绍足量的DWARF相关知识,能够阐明实际工作中调试信息是如何发挥其作用的就可以了。 ELF文件中的调试段

Windows调试工具入门2(WinDbg基本调试器设置)

Windows调试工具入门2—基本调试器设置 设置 Windows调试工具入门-2 本篇介绍Windows调试工具的基本设置和基本操作方法。这里我们会用一个测试程序一步一步说明如何使用WinDbg开始调试工作。首先用VC建立一个名为TestDebug1的控制台项目,并生成它。 、源码和可执行映像路径设置 符号、 一、符号 使用WinDbg开始调试工作之前,最重要的就是配置好各种环境了。这使得调试器可以正确识别调试目标中的各种变量、函数等等,使得我们能够进行符号化调试或者源码调试,而不是只能在一堆汇编代码中转圈。 首先来看一下未设置环境之前的样子。使用刚才说的TestDebug1项目,为了对比更清晰,用Release进行编译,链接选项中选中生成map文件和调试信息,如下: 在C/C++选项卡中设置如下:

程序代码如下: #include "stdafx.h" #include int main(int argc, char* argv[]) { printf( "TestDebug1.cpp"); return 0; } 编译之后,将Release目录下的TestDebug1.pdb剪切到其他目录下(如果没有这样做,由于编译出来的程序中包含了符号文件路径,调试器可以直接使用exe中的信息找到pdb文件,而不需要设置路径)。在map文件中可以看到像下面这样的内容: 0001:00000000 _main 00401000 f TestDebug1.obj 说明main函数位于401000地址处。 通过WinDbg的File->Open Executeable菜单打开TestDebug1.exe,可以在调试器命令窗口 中看到下面的内容:

TI低功率SmartPA调试系列之一扬声器工作原理及软件

Application Notes 1 TI 低功率Smart PA 调试系列之一: 扬声器工作原理及软件调试入门 Anjin Du/Ding Wei/Xiangyan Xue 摘要 本系列汇集了关于TI 低功率Smart PA 的四篇应用笔记,分别从扬声器基础、软件调试、算法等方面介绍了TI 低功率Smart PA 技术。本文是这个系列的第一篇,主要介绍了扬声器的基础知识和工作原理,以及TI 低功率闭环Smart PA 器件的架构和调试入门,是后续文章的基础。 随后的系列应用笔记还包括《TI Smart PA 基础调音指南》、《TAS25xx Smart AMP Anti-Clipper 模块的音效调试》、《TI Smart PA 算法介绍》。 目录 1 扬声器工作原理及结构 (2) 1.1 电动式扬声器的工作原理: (2) 1.2 电动式扬声器的结构: (3) 1.3 扬声器的音质的评判 (6) 2 扬声器的主要参数 (6) 3 低功率Smart PA 的引入及其对扬声器性能的提升 (10) 3.1 传统应用中扬声器参数对其性能的限制 (10) 3.2 低功率Smart PA 的工作原理及其对扬声器性能的提升 (10) 4 PPC3 软件的使用以及喇叭参数的获取 (12) 4.1 PPC3(Pure Path Console 3)软件介绍 (12) 4.2 扬声器参数的建模提取 (13) 5 总结 .............................................................................................................................................. 15 6 参考资料 (15) 图 Figure 1电动式扬声器工作原理示意图 (3) Figure 2电动式扬声器结构框图 (4) Figure 3 扬声器的主要组成构件 (4) Figure 4 传统功放和低功率闭环Smart PA 功放的工作原理比较 (11) Figure 5 Smart PA 架构 (12) Figure 7 PPC3 典型界面 (13) Figure 8 扬声器参数提取的硬件环境 (14) Figure 9 Smart PA 参数界面 (15)

Windows调试工具入门3(WinDbg基本调试操作)

Windows调试工具入门3—基本调试操作 Windows调试工具入门-3 基本调试操作 基本调试操作 一、调试器命令窗口 1、简介 使用Windows调试工具进行调试,大部分和调试器之间的交互都是通过调试器命令窗口来进行的。命令的输入、输出都是在调试器命令窗口中显示出来。对WinDbg来说,调试器命令窗口是名为”Command”的窗口;对于KD、CDB和NTSD来说,整个命令行窗口就是调试器命令窗口。这里主要介绍WinDbg中的调试器命令窗口。 一般来说WinDbg运行之后都会打开一个标题为Command的子窗口,在没有调试目标的时候,这个窗口是不能接受输入输出的,这时WinDbg处于静止模式,只有在打开调试目标之后,才能够使用它和调试器交互。 窗口分为三个部分: 位于上部的面积最大的是命令输出窗口。所有的命令输出、目标程序的调试信息输出等等都会在里面显示出来。上一篇中介绍的调试器日 志中记录的就是显示在这里的内容。

下半部分左边是提示符窗口。这里通过提示符能够快速知道调试器目前的状态。 上图中0:000>,冒号前的数字表示当前的进程号,同时调试多个进程 时,每个进程都会被指派一个进程号;冒号后的000表示线程号。 进行内核调试时,如果是单处理器系统,提示符是kd>的形式;如果 是多处理器系统,则是0: kd>的形式,前面的0表示处理器号。 提示符还可能是*BUSY*这样的字符串,以表示调试器正忙。也可以 通过命令来自定义提示符。 下半部分右边是命令输入窗口。需要执行的命令就在这里输入。 调试器命令窗口中输入命令时可以使用一些快捷操作: 上下方向键可以查找先前的命令。 ESC键用于清除当前行的命令。 TAB键用于自动补完命令。例如一些符号可以只输入一部分,然后通过按下TAB一次或多次来找到需要的符号。 鼠标右键点击命令窗口,可以将剪贴板中的内容粘贴到命令输入框中。 直接按下ENTER键重复上一条命令。这个功能在WinDbg中可以通过命令来打开或关闭。 如果某条命令产生了很长的输出,可以按下CTRL+BREAK来中断它。 二、控制调试目标的执行 这里的控制目标执行,主要是指如何让运行中的目标中断到调试器中,以及控制中断的目标如何继续执行。 1.中断调试目标 当调试目标处于运行状态时,WinDbg是不能输入命令或者对它进行操作的。可以通过 按下CTRL+BREAK或者点击工具栏的按钮来中断它。下面我们继续用上一篇中的TestDebug1项目来说明。修改TestDebug1.cpp如下: #include "stdafx.h" #include int main(int argc, char* argv[]) { int i = 0; while( 1) { printf( "TestDebug1.cpp:%d\r\n", i);

功能强大的vc6调试器

功能强大的vc6调试器 作者:yy2better 要成为一位优秀的软件工程师,调试能力必不可缺。本文将较详细介绍VC6调试器的主要用法。 windows平台的调试器主要分为两大类: 1 用户模式(user-mode)调试器:它们都基于win3 2 Debugging API,有使用方便的界面,主要用于调试用户模式下的应用程序。这类调试器包括Visual C++调试器、WinDBG、BoundChecker、Borland C++ Builder调试器、NTSD等。 2 内核模式(kernel-mode)调试器:内核调试器位于CPU和操作系统之间,一旦启动,操作系统也会中止运行,主要用于调试驱动程序或用户模式调试器不易调试的程序。这类调试器包括WDEB386、WinDBG和softice等。其中WinDBG和softice也可以调试用户模式代码。 国外一位调试高手曾说,他70%调试时间是在用VC++,其余时间是使用WinDBG和softice。毕竟,调试用户模式代码,VC6调试器的效率是非常高的。因此,我将首先在本篇介绍VC6调试器的主要用法,其他调试器的用法及一些调试技能在后续文章中阐述。 一位置断点(Location Breakpoint) 大家最常用的断点是普通的位置断点,在源程序的某一行按F9就设置了一个位置断点。但对于很多问题,这种朴素的断点作用有限。譬如下面这段代码: void CForDebugDlg::OnOK() { for (int i = 0; i < 1000; i++) //A { int k = i * 10 - 2; //B SendTo(k); //C int tmp = DoSome(i); //D int j = i / tmp; //E } } 执行此函数,程序崩溃于E行,发现此时tmp为0,假设tmp本不应该为0,怎么这个时候为0呢?所以最好能够跟踪此次循环时DoSome函数是如何运行的,但由于是在循环体内,如果在E行设置断点,可能需要按F5(GO)许多次。这样手要不停的按,很痛苦。使用VC6断点修饰条件就可以轻易解决此问题。步骤如下。 1 Ctrl+B打开断点设置框,如下图:

微机原理实验一调试程序的使用

物理与机电工程系 (2015——2016 学年第一学期) 《调试程序的使用》 上机实验报告 专业:电子信息科学与技术 学号: 1524812252 姓名:刷卡机 任课教师:风机房 实验地点:理工实验楼9007 项目编号:实验一

执行R命令,即查看、修改CPU寄存器的内容,此时执行结果为: AX =0000 DS=1420 BX=0000 SS=1420 CX=0000 CS=1420 DX=0000 ES=1420 执行D命令,即显示存储单元中的内容命令,此时执行结果为:1420:0100 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 1420:0110 00 00 00 00 00 00 00 00-00 00 00 00 34 00 0F 14 ................ 1420:0120 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 1420:0130 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

-T AX=EE9A BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1420 ES=1420 SS=1420 CS=1420 IP=0129 NV UP EI NG NZ AC PE NC 1420 : 0129 0000 ADD [BX+SI] , AL DS:0000=D1 这是第一条指令执行后的结果和各寄存器内的存储变化码以及其机器显示,此时的标志位为NV UP EI NG NZ AC PE NC 即 溢出标志OF=0 不溢出方向标志DF=0增) 中断标志IF=1开中断符号标志SF=1为负 零标志ZF=0为非零辅助进位AF=1辅助有进位

调试器用户手册

调试器用户手册 1.概述 Debug link仿真器是针对我司8位系列芯片设计的专用开发工具,LCM08系列,可实现在线调试功能和下载烧录程序 在线调试是通过Keil软件来实现硬件仿真,可以进行单步运行、全速运行、程序复位和停止程序运行等操作。在线调试主要用于产品开发阶段,方便用户调试程序,提高开发效率。 2.开发工具 开发工具包括硬件和软件两类: 硬件:1.DEBUG LINK调试器 2.芯片开发板 https://www.doczj.com/doc/c210870101.html,B转方口线(打印线) 4.6芯排线。 软件:Keil C51 该仿真器适用于LCM08FXX-8位系列MCU产品; 实物图: 图一:调试器实物图

图二:调试器接线 功能说明: ①USB接口:侧面为USB插孔,使用USB线缆连接仿真器与电脑,用于通讯和提供仿真器电源。 ②调试接口:侧面为调试接口,使用6芯排线连接开发板或芯片。 ③LED指示灯:仿真器面板上有2个LED指示灯。 红色Power指示灯:仿真器供电后该灯点亮。 绿色Busy指示灯:1)仿真器调试时该灯点亮;2)下载时:绿灯亮,下载完成后绿灯熄灭。 2.2. 3.调试器拨码开关与供电关系说明 调试器下载线旁拨码开关与供电关系: 编码开关:调试器VDD供电: ALL OFF VDD不供电,应用于外部Power供电情况 1ON;2OFF调试器VDD供电,输出电压由DLL文件决定 1OFF;2ON VDD不供电,应用于外部Power供电情况 1ON;2ON调试器VDD供电,输出电压由DLL文件决定 即拨码开关1控制调试器VDD供电是否输出

建议使用时,两个拨码均拨下来,如上图所示,采用外部供电时仿真,拨上去。 2.2.4.Debug Link仿真器调试接口说明 Debug Link仿真器调试接口如图3所示 图3:调试器6PIN输出引脚 ①6芯调试接口:该接口对应管脚如图4所示,6芯调试接口左上角为1脚: 图4:调试器接口引脚示意图 1脚:SDA连接芯片调试接口DATA管脚。 2脚:NC 3脚:GND电源地。 4脚:SCK连接芯片调试接口CLK管脚。 5脚:RST连接芯片复位管脚。 6脚:VCC调试时仿真器电源输出管脚,只有当芯片调试仿真连接上时,才会有电源输输出(注:根据DLL文件不同配置可输出 3.3V或5V)调试器PCB板上也有丝印标识。 硬件连接:USB接电脑,方口接调试器;6pin线将调试器和芯片或者demo板系统连接.如图4所示,VDD,Gnd,以及三个烧录脚,五个脚确认相互对应连接。

HTTP调试工具

HTTP调试工具 这个工具我已经使用比较长时间了,对我的帮助也挺大,今天我翻译的微软的文章,让更多的朋友都来了解这个不错的工具,也是我第一次翻译文章,不恰当之处请大家大家多多指正。 介绍: 你是不是曾经疑惑过你的web程序和IE是如何交互的?你是不是遇到过一些奇怪的而你又无法解决的性能瓶颈?你是不是对那些发送给服务器端的cookie 和那些你下载下来的被标记为可缓存的内容感到好奇? Fiddler官方网站及下载地址:https://www.doczj.com/doc/c210870101.html,/Fiddler/dev/ 微软的Fiddler能够帮助你回答以上的问题,不但如此,它还是一个http调试代理,它能够记录所有的你电脑和互联网之间的http通讯,Fiddler 可以也可以让你检查所有的http 通讯,设置断点,以及Fiddle 所有的“进出”的数据(指cookie,html,js,css等文件,这些都可以让你胡乱修改的意思)。 Fiddler 要比其他的网络调试器要更加简单,因为它仅仅暴露http通讯还有提供一个用户友好的格式。 Fiddler 包含一个简单却功能强大的基于JScript .NET 事件脚本子系统,他非常灵活性非常棒,可以支持众多的http调试任务。Fiddler 是用C#写出来的。 接下来是一大段废话,关于如何安装的,只要一路next,就可以了。这段话我就跳过,直接切入正题了。 Running Fiddler 当你启动了Fiddler,程序将会把自己作为一个微软互联网服务的系统代理中去。你可以通过检查代理设置对话框来验证Fiddler是被正确地截取了web请求。操作是这样的:点击IE设置,工具,局域网设置,最后点击高级。 作为系统代理,所有的来自微软互联网服务(WinInet)的http请求再到达目标Web 服务器的之前都会经过Fiddle,同样的,所有的Http响应都会在返回客户端之前流经Fiddler。这样,就能明白Fiddler很多作用了吧!

调节器的工作原理与调试方法

调节器的工作原理与调试方法 一、结构组成 1、采用标准嵌入式结构系统 2、由自动通道与模拟通道构成 3、自动通道由输入板、双CPU板、输出板组成 4、模拟(手动)通道独立工作板 二、作用 1、调节输入板 该板主要用于遥测、遥信输入,遥测信号主要采集定子电流、系统电压、机端电压、励磁电压、励磁电流,通过霍尔传感器变换后送到CPU进行处理;遥信主要采集开机令、停机令、灭磁开关位置、油开关位置、整流故障、停风等信号通过光电隔离后再送到CPU板。 2、CPU板 两块电路板共享模拟信号,互相监视,互为热备用,即两套微机板都在线工作,当一台出现故障,则立即切换到另一台微机运行,切换无扰动。 由PT、CT、励磁电压、励磁电流等送来的模拟及数字信号,先进行隔离变换,再送到微机板,在双微机系统中,每块微机板都得到相同的输入信号,进行同样的运算处理。其输出信号采取封门的方式由逻辑电路自动进行切换。微机的输出信号经过隔离放大后去推动执行器件。 3、输出板 主要功能是通过同步变压器实时跟踪励磁变压器副边的同步信号,根据调节器的控制信号输出六路脉冲,控制三相全控整流桥的输出,同时也具有完善的控制、逻辑、限制、保护和接口等功能。 4、手动模拟调节输出板 此模拟通道作为后备用,它与主控通道独立,按励磁电流闭环控制方式调节。 该板能通过调节增、减磁按钮进行独立调节励磁电流,在一般情况下均由微机自动完成调节任务。

三、调试方法 1、输入板: 可调节P1(机端电压)、P2(系统电压)、P4(励磁电流);以上调节均在并网前调节。 方法: (1)、起励后在恒流位置时调节P1即机端电压,使数码显示中的A0000与实际电压一致,如机端电压此时为6000V时数显应调节为A6000。 (2)、在恒压位置时调节P4即励磁电流,使数码显示的D0000与实际电流一致,如并网前的励磁电流为100A时数显应调节为D0100。 (3)、P2在恒压、恒流时均可调,即调节P2使数显C与当前的系统电压一致即可。 2、CPU板 调节W1使模拟量工作电源(VREF)为5V 按键说明: K1-----切换键 K3-----增Ukp值 K4-----减Ukp值 K5-----增Ikp值 K6-----减Ikp值 K7-----置位 3、手动板 在手动板工作时,调节P1可以改变机端电压限制值。 调节P2使U4(芯片LM308)的输入、输出的IK绝对值应相等;调节P3使U11(芯片LM308)的输入、输出的UK绝对值应相等。 四、显示板的按键机显示功能 1、S1、S2为数显功能切换键,S3为恒压/恒流切换键,S4为自动/ 手动切换键。 2、数显功能 A 机端电压 B 给定电压 C 系统电压 D 励磁电流 E 励磁电流给定 F UKP值 G UKI值 H IKP值 I IKI值

胶印机的机构原理与操作调试

胶印机的机构原理与操作、调试1、什么叫规矩?在单张纸胶印机上,规矩的作用是什么? 规矩是指用来控制纸张定位位置的机构,为了保证彩色印刷的套印准确,在单张纸胶印机上,规矩部件的作用就在于对将要进入压印滚筒的纸张,进行正确的定位。从而使纸张获得一个与滚筒位置相对应的正确方法,并依此保证图文在纸张上有固定的相对位置。 纸张在规矩部件的定位,应当达到两个方向上的位置准确,即走纸的前后方向&走纸的左右方向。在前后方向定位的规矩称为前规,在左右方向定位的规矩称为侧规,前规和侧规两者的挡纸板呈直角关系。 规矩部件的质量、性能和调节的水平,不但影响着印品质量的好坏,而且对胶印的生产效率和经济效果,也有着直接的影响。所以说,正确地采用先进的规矩,并加以认真地调节,是一项重要的工作。 2、什么叫前规?其作用是什么? 在输纸板前缘的上方或者下方,装有一个绕着自身轴心上下摆动的部件,因为这个部件工作在纸张运动的前进方

向,并借助于纸张的前边缘来对纸张进行前后方向的定位,所以称它为前规。 前规的主要作用在于:当从输纸板上送来的纸张同它的挡纸板接触后,以挡纸板面为准,使纸张的咬口边缘齐平,为纸张的定位和准确套印作准备。 因为前规所要定位的对象是由输纸板传送过来的纸张,而且该纸张在到达前规前,正处于运动中,所以,前规的职能仅仅是让运动着的纸张静止下来。 3.什么叫侧规矩?其作用是什么?结构形式有哪几种? 所谓侧规矩,就是对纸张的左右方向进行定位的规矩,通称侧规。 侧规的主要作用是把在前规处定位的纸张,从侧面拉过来或者推过去,使纸张的侧边缘齐平。即完成纸张在没有被递纸牙拉走之前的最后一道定位工序。 侧规的种类很多,常见的主要有,滚轮连续转动式、扇形板间歇摆动式、拉板移动式和气动式侧拉规。被国产胶印机所采用者主要有以下四种。 ①拉板移动式侧规海德堡102VP型胶印机上使用此侧规,在国产J2109型等胶印机上的侧规也采用了此侧规。

改变或关闭WINDOWS默认调试器

改变或关闭WINDOWS默认调试器 安装https://www.doczj.com/doc/c210870101.html, 后,原默认调试器vc6被替换,修改注册表即可恢复. 用regedit打开hkey_local_machine\software\microsoft\windows NT\CurrentVersion\AeDebug,修改Debugger的键值为previsualstudio7debugger的键值,重新启动即可.下面给出值,以便日后查阅 Debugger:"C:\program files\microsoft visula studio\common\msdev98\bin\msdev.exe" -p %ld -e %ld PreVisualStudio7Debugger:"C:\program files\common files\microsoft shared\vs7debug\vs7jit.exe" -p %ld -e %ld Visual Studio 调试器 调试器指南 Visual Studio 调试器是一个功能强大的工具,它使您可以观察程序的运行时行为并确定逻辑错误的位置。该调试器可用于所有的Visual Studio 编程语言及其关联的库。使用调试器,可以中断(或挂起)程序的执行以检查代码,计算和编辑程序中的变量,查看寄存器,查看从源代码创建的指令,以及查看应用程序所占用的内存空间。使用“编辑并继续”,您可以在调试时对代码进行更改,然后继续执行。 Visual Studio 调试器提供了一个用于访问调试器工具的“调试”菜单。调试器的窗口和对话框显示有关您的程序的信息,并允许您输入附加的信息。您可以通过按F1 获得关于任何窗口或对话框的帮助。 如何关闭Visual Studio实时调试器 1.打开Visual studio 2005 2.禁用实时调试在“工具”菜单中单击“选项”,选择“调试”文件夹,选择“实时”页,清除相关的程序类型:“托管”、“本机”、“脚本”。单击“确定”。

空腔双工器的原理和调试

空腔双工器的原理和调试 双工器是有着尖锐的调谐持性的装置,用来隔离接收和发射。它允许一根天线完成发射和接收,而不用担心发射装置的射频能量去轰击接收机。当然,那样做必须将发射频率和接收频率分开,称为频差。在2米波段的频差是600KHZ;在70Cm波段有着较大的宽度,是5MHZ。 通常,双工器工作在狭窄的通频带上,有着不可思议的陡峭的截止曲线。不同于一般意义上的高通或低通滤波器。 有好几种方法来实现双工器,业余上常用空腔和相位线的方法。《ARRL》手册上有详尽的工作原理。 《ARRL》手册上也给出了六空腔的双工器,之后又解释了其工作原理。我也按照做了一个并让它工作,但我发现这个设计调谐起来非常困难,信噪比也一直不稳定,所以我不想在这里介绍它们。我相信,现在已经有调谐简单实际可行的双工器被设计制造出来了。 我一直推崇的一款双工器是名叫"华康"(Wacom)的设计。它用4个8吋的腔体构成“带通(band pass)/带阻(band reject)”模式。借助于高Q值的腔体和良好的设计,Wacom 仅用4个腔体就有相当于6个腔体的良好表现。唯一的缺点是费用较高。 图一详细给出了它的结构,其中两个腔体组成一组与发射机输出端连接;另外两个与接收机输入端连接。用“T”型接头将它们连接起来,再通过同轴电缆与天线相连。 图一四腔带通/带阻双工器连接图

每个腔体都有二个功能。第一,必须通过想得到的信号(即带通或通带);第二,必须尽可能阻止不想要的信号(即带阻或阻带)。在(图2)中我给出了用于发射的空腔滤波器典型响应曲线。请注意,它在145.37MHZ的发射频率上通过了几乎所有的信号,并且在接收频率处,即低于发射频率600KHZ处有着-30dB+的衰减。同样,两个接收腔体也精确地匹配,除了它们的通频点在144.77MHZ的接收频率上外,它们阻带的谷点都在发射频率145.37MHZ上。 这样,发射腔体将滤除发射机所产生的较宽频带上的噪声(殘余发射)使其不进入接收机,而接收腔体也将滤除发射机产生的射频功率使其不进入接收机。 发射装置不仅能输出所希望的频率上的能量,而且,会在离中心频率相当宽的一段距离内有衰减地输出白噪声(丝丝声)。如果你的 发射装置输出过多的白噪声,腔体就不能够把它们全部分离出来。一

监视器、摄像机的调试原理

电视原理、制式及CCD简介 13.1.1 电视原理 当人们实现了文字、声音信息的远距离传送(电报、电话、无线电通信广播)之后,自然就有一种强烈的愿望——把远方活动景象传送到眼前而实时地看到视力范围之外的世界。这就是人类“千里眼”的梦想,“TELEVISION(电视)”的由来。毕竟使人类通过视觉器官获取的信息量,远远超过其他感觉器官获得的信息量,所谓“百闻不如一见”就是这个道理。 人眼观看的景象,是在视力范围的空间中存在并与外界环境相联系的一切活动的和静止的人、物形象的反映。外界存在是客观的,但给各人的映像又有其个人主观的心理和生理因素的影响。在视力范围之外的景象,是由电视作为传送的媒介,如图13-1,其任务就是尽可能逼真的再现外界的客观景象,使其符合一般人的视觉生理特性,让观察者没有异样的感觉,如同直接对自然景象的观察。为实现这一目标,电视技术的发展和完善必然涉及生理学、心理学、光学、电子信息材料等学科和各种机械、电子、半导体等工艺技术。这里仅就几个最基本的问题作简单的介绍。 图13-1 介于人与外界之间的电视系统 1.图像的扫描传送 电视系统原理简述框图如图13-2所示。 在电视之前,照相机、电影摄影机已对镜头有了深入的研究。电信通信理论和技术的发展解决了传送通路的问题。阴极射线示波管奠定了显示器件的基础。要实现电视的功能,在有完善的光电传感器件和电光转换显示器件的基础上,技术原理首要解决的是图像的实时传送并原样恢复的问题。 图13-2 电视系统简述框图 声音是一种只随时间单一变化的量,当它变换为电信号(电压或电流)后在电信通道内传送时,符合电信通道传送的电流或电压只能是时间的单值函数的要求。声/电传感器和电/声变换器只解决非电量和电量的转换问题。但是图像的传送却要复杂得多。自然景物和人构成的图像,它是在三维空间中存在和活动的,而且各个景物和人的各部位给人眼有着不同的明暗和色彩感觉,这种随时可能变化的丰富多彩的画面,怎样变成随时间变化的单值函数来传送而后又实时地恢复为满意的图像呢? 人们首先将问题由空间简化为平面。实际上在此之前即有的电影、照片、彩印的图像都是平面的,现在的彩色电视图像也是平面的,供人们观看都有满意的效果。在电视技术发展过程中,彩色电视是在黑白电视基础上发展起来的,因此,对于传送电视图像的基本原理的了解可进一步简化为如何实现黑白电视图像的传送问题。 一幅图像可以分解为若干个成矩形阵列排列的有一定几何尺寸的微小单元(图13-3)。现今的固体面阵传感器件正是这样的形式,其每个微小单元称之为“像素”。处于H×V平面上的每个像素有着不同的水平h和v位置,在光线照射下,在某一时刻t每个像素反射或透射出不同的亮度L值,可以由式13-1描述。 图13-3 像素矩阵排列 L = F1(h,v,t) (13-1) 要实现电视的传送,即将平面上随时间变化的各个像素的亮度值(变换为电流或电压)有规

调试工具Debug介绍

调试工具DEBUG介绍 启动DEBUG的一般命令如下:DEBUG文件名[参数表] 其中:文件名指定被调试的文件,其包括文件名和后缀,参数表是被调试文件运行时所需要的参数(可省)。 被调试的文件通常的后缀为.EXE或.COM。 当DEBUG启动成功后,将显示连接符“-”,这时,可输入各种DEBUG命令。DEBUG 中标志位的符号表示如表1所示,其所有命令及其含义如表2所示。 关于参数的几点说明: 1.进制:在DEBUG中输入或显示的数据都是十六进制形式 表1DEBUG中标志位的符号表示 表2DEBUG命令及其含义

2.分隔:命令和参数、参数和参数之间要用空格、逗号或制表符等分隔 3.地址:用“段值:偏移量”的形式来表示地址,也可用段寄存器来代表“段值” 例如:1000:0,ds:10,es:200,cs:30等 4.范围:用来表示地址范围,从哪个地址开始,到哪个地址结束。它有二种表示方式: ◆地址地址——前者表示起始地址,要用“段值:偏移量”来表达,后者 表示终止地址,只用“偏移量”来表示 ◆地址长度——前者表示起始地址,要用“段值:偏移量”来表达,后者 表示该区域的大小,用字母’L’开头的数值来表示 例如:100:50 100——段值为100,偏移量从50到100的内存区域, 100:50 L100——段值为100,偏移量从50开始的100个字节区域。 5.端口地址:二位十六进制数值 6.字节值:二位十六进制数值 7.字节值表:由若干个字节值组成,也可以是用引号括起来的字符串 8.驱动器号:0—驱动器A、1—驱动器B、2—驱动器C、3—驱动器D等 关于使用命令的几点说明: 1、在DEBUG中的提示符“-”下才能输入命令,在按“回车”键后,该命令才开始执行 2、命令是单个字母,命令和参数的大小写可混合输入 3、可用F1、F2、F3、Ins、Del、左移键、右移键等编辑键来编辑本行命令 4、当命令出现语法错误时,将在出错位置显示“^ Error” 5、可用^C或^Break来终止当前命令的执行,还可用^S来暂停屏幕显示(当连续不断地显示信息时) 例2.1:启动DEBUG,并装入test.exe文件(假设该文件已存在)。 解:…\>debug test.exe 例2.2:比较以DS为段值,偏移量从10到50的内存区域与从地址100:20开始的内存区域。解: -C DS:10 50 100:20 或-C DS:10 L41 100:20 例2.3:显示以DS为段值,偏移量从10到50内存区域的单元内容,然后用’abc’来填充它。解: -D DS:10 50 或-D DS:10 L41 -F DS:10 50 ‘abc’ 例2.4:显示十六进制1234与4321之和、差。 解: -H 1234 4321 例2.5:把数据段区域DS:0-40内的内容传送给从附加段ES:10开始的内存中。 解: -M DS:0 40 ES:10 例2.6:在数据段区域DS:0-40内查找是否有字符串’CIH’。 解: -S DS:0 40 ‘CIH’

Windows调试工具入门4(WinDbg内核调试配置)

WinDbg内核调试配置 内核调试主要用来调试驱动代码、分析内核结构等。WinDbg通过两台电脑可以实现内核调试,其中一台电脑运行WinDbg,被称为主机;另外一台电脑运行被调试的程序或系统,被称为目标机。一般情况下两台电脑都是真实机器,这样调试最符合实际情况,两台电脑通过串口线、1394线或USB对联线连接起来实现双机内核调试。如果没有两台电脑,也可以用虚拟机来模拟目标机,主机上运行WinDbg,虚拟机中安装Windows运行被调试的程序,虚拟机通过模拟的串口输出为主机上的一个命名管道,从而和主机上的WinDbg连接起来实现双机内核调试。 除双机内核调试外,WindowsXP后还引入了一种本机内核调试方式,只需要一台电脑,直接运行WinDbg就能查看修改系统内核结构等,不过所有和中断目标机系统相关的命令都不能执行,如断点命令。 如果采用虚拟机模拟目标机,调试响应速度有时候是个问题,比1394线连接的真实双机调试速度要慢不少,特别是执行操作大量内存的命令时(如搜索内存命令),感觉非常明星。所以针对这种情况还会介绍一个特殊的辅助调试工具vmkd,该工具可以大大加速内核调试的速度,为咱们带来不少方便。 下面分节详细介绍各种内核调试情景下的配置,尽量每个步骤都截图说明。 真实机双机内核调试 真实机之间的内核调试首先需要准备连接线,可以用串口线、1394线或者USB对联线。 串口线速度太慢,而且电脑城一般买不到可以直接使用的串口线,需要把线和接头买回来自己焊,按照WinDbg 帮助中的说明交叉焊接,就能得到一根可用来调试的串口线。用串口线把两台电脑连接上后,先用Windows自带的超级终端工具,选择好串口和波特率连接。如果在超级终端中按键能在另外一台电脑的超级终端上显示按键,则表示串口线连接成功。接下来就可以用WinDbg连接串口调试。某些笔记本上可能没有串口,可以买一个USB转串口的接头,然后设置USB转换后的串口号,就能把这台笔记本当作主机使用。 1394线速度快,价格也便宜,如果电脑上没有1394口,可以再另外买一个1394卡,价格也很便宜。1394分大口和小口,只需按照电脑上的接口大小购买合适的线就行。如果没有1394口,装一个1394卡又很麻烦,则也可以买一个USB转1394口的接头,不过一样只能当作主机使用。 USB对联线是Vista系统以后支持的内核调试连接方式,没见到哪里能买到这样的线,估计速度会更快一点吧! 因为1394线连接调试最方便,速度也比较快,所以建议使用这种方式。 电脑、连接线等准备好后,先设置目标机系统,启用内嵌在系统中的内核调试引擎。Vista之前的系统,用记事本打开系统盘根目录下的boot.ini文件,添加新的启动项,在新的启动项上添加调试选项。如下表,红色行表示新加的启动项,/debug表示打开内核调试引擎,/debugport=1394表示采用1394连接方式,/channel=10表示设置通道号为10。 [boot loader] timeout=30 default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS [operating systems] multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin/fastdetect multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="WINXP-Debug"/noexecute=optin/debug /debugport=1394/channel=10 Vista之后的系统需要修改BCD数据库,利用bcdedit工具添加启动项,设置调试选项。如下表,以管理员方式

变频器的基本原理及调试方法讲解

变频器的基本原理及调试方法讲解 1.变频器基础 1: VVVF 是Variable Voltage and Variable Frequency 的缩写,意为改变电压和改变频率,也就是人们所说的变压变频。 2: CVCF 是Constant Voltage and Constant Frequency 的缩写,意为恒电压、恒频率,也就是人们所说的恒压恒频。 我们使用的电源分为交流电源和直流电源,一般的直流电源大多是由交流电源通过变压器变压,整流滤波后得到的。交流电源在人们使用电源中占总使用电源的95%左右。 无论是用于家庭还是用于工厂,单相交流电源和三相交流电源,其电压和频率均按各国的规定有一定的标准,如我国大陆规定,直接用户单相交流电为220V,三相交流电线电压为380V,频率为50Hz,其它国家的电源电压和频率可能于我国的电压和频率不同,如有单相100V/60Hz,三相200V/60Hz等等,标准的电压和频率的交流供电电源叫工频交流电。 通常,把电压和频率固定不变的工频交流电变换为电压或频率可变的交流电的装置称作“变频器”。 为了产生可变的电压和频率,该设备首先要把电源的交流电变换为直流电(DC),这个过程叫整流。 把直流电(DC)变换为交流电(AC)的装置,其科学术语为“inverter”(逆变器)。 一般逆变器是把直流电源逆变为一定的固定频率和一定电压的逆变电源。对于逆变为频率可调、电压可调的逆变器我们称为变频器。 变频器输出的波形是模拟正弦波,主要是用在三相异步电动机调速用,又叫变频调速器。 对于主要用在仪器仪表的检测设备中的波形要求较高的可变频率逆变器,要对波形进行整理,可以输出标准的正弦波,叫变频电源。一般变频电源是变频器价格的15--20倍。 由于变频器设备中产生变化的电压或频率的主要装置叫“inverter”,故该产品本身就被命名为“inverter”,即:变频器。 变频器也可用于家电产品。使用变频器的家电产品中,不仅有电机(例如空调等),还有荧光灯等产品。 用于调节电源供电的频率。 汽车上使 用的由电池(直流电)产生交流电的设备也以“inverter”的名称进行出售。 变频器的工作原理被广泛应用于各个领域。例如计算机电源的供电,在该项应用中,变频器用于抑制反向电压、频率的波动及电源的瞬间断电。 2. 电机的旋转速度为什么能够自由地改变? n = 60f/p(1-s) n: 电机的转速f: 电源频率p: 电机磁极对数s:电机的转差率电机的转速= 60(秒)*频率(Hz)/电机的磁极对数- 电机的转差率 电机旋转速度单位:每分钟旋转次数,rpm/min也可表示为rpm 电机的旋转速度同频率成比例同步电机的转差矩为0,同步电机的转速= 60(秒)*频率(Hz)/电机的磁极对数 异步的转速比同步电机的转速低。 例如:4极三相步电机60Hz时低于1,800 [r/min> ?? 4极三相异步电机50Hz时低于1,500 [r/min> 本文中所指的电机为感应式交流电机,在工业领域所使用的大部分电机均为此类型电机。感应式交流电机(以后简称为电机)的旋转速度近似地确决于电机的极对数和频率。 由电机的工作原理决定电机的磁极对数是固定不变的。由于电机的磁极对数1个磁极对数等

相关主题
文本预览
相关文档 最新文档