ODB调试_转自网易博客
ODB命令及使用
1)基本概念日志文件:仿真日志(DES log,Discrete Event Simulation log)和错误日志(Error log)。
它的内容是在仿真过程中由进程调用OPNET 函数op_prg_log_handle_create ()op_prg_log_entry_write ()写入的。
在Help 菜单下可以打开错误日志文件。
错误日志文件以文本方式保存为<home>/op_admin/err_log,除了在菜单中打开也可以在OPNET 控制台(console)窗口输入op_vuerr 命令查看。
它包含了函数调用堆栈信息,我们可以从函数阶层性的调用关系中精确定位出错位置。
在编写函数时必须使用FIN(function begin)、FOUT(function out)、FRET(function return)等界定函数范围的标识符,而且必须使它们配对。
编写程序时切记使FIN 和FOUT/FRET 配对。
要产生ODB 调试信息,必须将仿真核心类型设定为development,优化的仿真核心(optimized)为了加快仿真速度不产生ODB 调试信息。
之后我们还需要在仿真属性中包含debug 环境变量。
ODB 为控制和管理仿真行为提供一个交互式环境。
ODB 支持断点(Breakpoint)定义,跟踪并显示仿真诊断信息。
ODB 功能的实现有赖于进程模型中编写相应的程序支持,作为ODB 指令激活调试状态(breakpoint、trace 和action)的依据,可以在ODB 窗口中输入help<参数:all,basic,action,event,memeory,misc,object,packet,process,scripting,stop,trace>查看感兴趣的指令。
ODB常用的指令分为basic,event,object,packet,stop,trace,process 几类。
OD使用完全教程
OD使用完全教程.txt如果不懂就说出来,如果懂了,就笑笑别说出来。
贪婪是最真实的贫穷,满足是最真实的财富。
幽默就是一个人想哭的时候还有笑的兴致。
OllyDbg调试工具使用完全教程一,什么是 OllyDbg?OllyDbg 是一种具有可视化界面的 32 位汇编-分析调试器。
它的特别之处在于可以在没有源代码时解决问题,并且可以处理其它编译器无法解决的难题。
Version 1.10 是最终的发布版本。
这个工程已经停止,我不再继续支持这个软件了。
但不用担心:全新打造的 OllyDbg 2.00 不久就会面世!运行环境: OllyDbg 可以以在任何采用奔腾处理器的 Windows 95、98、ME、NT 或是 XP(未经完全测试)操作系统中工作,但我们强烈建议您采用300-MHz以上的奔腾处理器以达到最佳效果。
还有,OllyDbg 是极占内存的,因此如果您需要使用诸如追踪调试[Trace]之类的扩展功能话,建议您最好使用128MB以上的内存。
支持的处理器: OllyDbg 支持所有 80x86、奔腾、MMX、3DNOW!、Athlon 扩展指令集、SSE 指令集以及相关的数据格式,但是不支持SSE2指令集。
配置:有多达百余个(天呀!)选项用来设置 OllyDbg 的外观和运行。
数据格式: OllyDbg 的数据窗口能够显示的所有数据格式:HEX、ASCII、UNICODE、 16/32位有/无符号/HEX整数、32/64/80位浮点数、地址、反汇编(MASM、IDEAL或是HLA)、PE文件头或线程数据块。
帮助:此文件中包含了关于理解和使用 OllyDbg 的必要的信息。
如果您还有 Windows API 帮助文件的话(由于版权的问题 win32.hlp 没有包括在内),您可以将它挂在 OllyDbg 中,这样就可以快速获得系统函数的相关帮助。
启动:您可以采用命令行的形式指定可执行文件、也可以从菜单中选择,或直接拖放到OllyDbg中,或者重新启动上一个被调试程序,或是挂接[Attach]一个正在运行的程序。
od 调试原理
od 调试原理Debugging is the process of finding and fixing errors or bugs in a computer program. 调试是在计算机程序中查找和修复错误或漏洞的过程。
It is an essential part of software development, as even the most carefully written code can contain bugs that need to be identifiedand resolved. 这是软件开发中必不可少的一部分,因为即使是最仔细编写的代码也可能包含需要被识别和解决的bug。
There are various methods and tools used for debugging, and different programmers may have their own preferred techniques. 有各种方法和工具用于调试,而不同的程序员可能有他们自己偏好的技术。
One common method for debugging is to use a debugger, which is a software tool that allows the programmer to step through the code and inspect the values of variables at different points in theprogram's execution. 一种常见的调试方法是使用调试器,这是一种软件工具,允许程序员逐步执行代码,并检查程序在不同执行点的变量值。
This can help pinpoint exactly where an error is occurring and provide insight into how to fix it. 这可以帮助准确定位错误发生的地方,并提供修复它的见解。
用BDM调试的使用方法及步骤
用BDM调试的使用方法及步骤光电组-张晓明1、在Code Warrior环境下按以下操作方式下载程序到单片机A、打开Project项B、选择Make是进行工程的编译、选择Debug项调试项,是进行编译并下载到单片机的。
上述两项操作可用快捷键F7键和F5键来代替,F7是编译,F5是下载。
2、上述步骤操作后,在BDM环境下会出现如下按确定就可以3、第一次下载按完确定会出现如下窗口,打钩后下次就不再出现了(换新单片机会再次出现)4、点击OK(或按键盘回车键),等待程序下载完成5、结束后进入BDM环境6、找到第三个框(Data1框),该框是调试用的最多的一个子框,用于观看变量变化情况,以及在线给单片机状态值等在此就能看到变量以及寄存器的状态等等按下面的绿色键运行,也可直接按F5在空白处双击鼠标可以增加你想查看的全局变量(必须是全局变量)输入变量名按OK新加的变量颜色和自动提供的不太一样7、修改操作环境,如设成周期性读取状态,观看变量值等单击右键,按下图所示操作选择Periodical…会出现改变Rate框里的数字可以改变一个时间段数据刷新的频率,为了及时查看,一般设为1,大家也可以自己设置(均为整数),然后按OK同样,可以设置查看的数据形式,如二进制,八进制,十进制,十六进制等,第一次下载默认为十进制显示,单击右键,找到Format选择ALL的话是将Data1子框的所有数据按同样的形式显示选择Selected是将自己选中的数据进行相应形式的显示如下图,原先是按十进制显示的按上述操作,并选择Selected�Bin,则变成如下显示8、上述步骤操作结束后,为了下次不再输入变量,改操作环境等等,可按Ctrl+S保存,或按图中所示按钮保存9、在线调试,连着BDM回到总BDM模式,即退出Data1窗口最大化,选择Source子窗口,按红色停止按钮,即变成如下形式按Single Step单步运行,按Step Over功能和Single Step类似,这两个按键可以查每一句语句的执行情况按Step Out跳出函数,不想查看的函数,如延时等,都可以直接跳过去,节省时间。
菜鸟教程第零课、开启ce自身保护、设置od,让调试不非法
1置
到论坛搜索最新的OD,多试几个。在360里添加信任。
先打开OD,再打开游戏。在使用OD时,不要使用内存访问和写入断点,其它断点可以使用。
第零课开启ce自身保护设置od让调试不非法因为好多人调试出错所以写下这一课
第零课、开启ce自身保护、设置od,让调试不非法
因为好多人调试出错,所以写下这一课。不过第一课已经有了,咱就叫做第零课吧。应该不会出第负一课了^ ^
因为新区加驱动保护了,而老区没有。新手,请登录老区分析,新手还是先将过驱动放一边吧。
od使用教程
od使用教程
使用开发者工具(OD)可以帮助开发人员调试和测试应用程序。
下面是一些OD的常用功能和使用方法的教程:
1. 查看控制台输出信息:在OD中打开开发者工具控制台,可以查看应用程序输出的日志、错误和警告信息。
2. 调试JavaScript代码:在OD的“Sources”选项卡中,可以查看和编辑应用程序的JavaScript代码。
可以通过在代码中设置断点,并使用“Step Over”、“Step Into”和“Step Out”等按钮来逐行执行代码。
3. 检查和修改样式:在OD的“Elements”选项卡中,可以查看和修改应用程序的HTML和CSS样式。
可以在“Elements”面板中选择元素,并在“Styles”面板中编辑其样式。
4. 模拟设备和网络:在OD的“Device Mode”选项卡中,可以模拟不同的设备类型和网络条件,以确保应用程序在不同环境下的表现。
5. 监测网络请求:在OD的“Network”选项卡中,可以查看应用程序发送和接收的网络请求。
可以查看请求的详细信息,如请求头、请求参数和响应状态。
6. 性能分析:在OD的“Performance”选项卡中,可以进行应用程序的性能分析。
可以查看页面加载时间、资源占用和函数执行时间等。
这些是OD的一些常用功能和使用方法的简要介绍。
希望对你有帮助!。
OD反调试大全
调试技巧总结-原理和实现-------------------------------------------------------------------------------------------------------2008.8.7 shellwolf一、前言前段学习反调试和vc,写了antidebug-tester,经常会收到message希望交流或索要实现代码,我都没有回复。
其实代码已经在编程版提供了1个版本,另其多是vc内嵌asm写的,对cracker而言,只要反下就知道了。
我想代码其实意义不是很大,重要的是理解和运用。
做个简单的总结,说明下实现原理和实现方法。
也算回复了那些给我发Message的朋友。
部分代码和参考资料来源:1、<<脱壳的艺术>> hawking2、<<windows anti-debugger reference>> Angeljyt3、4、<<软件加密技术内幕>> 看雪学院5、<<ANTI-UNPACKER TRICKS>> Peter Ferrie我将反调试技巧按行为分为两大类,一类为检测,另一类为攻击,每类中按操作对象又分了五个小类:1、通用调试器包括所有调试器的通用检测方法2、特定调试器包括OD、IDA等调试器,也包括相关插件,也包括虚拟环境3、断点包括内存断点、普通断点、硬件断点检测4、单步和跟踪主要针对单步跟踪调试5、补丁包括文件补丁和内存补丁反调试函数前缀检测攻击通用调试器 FD_ AD_特定调试器 FS_ AS_断点 FB_ AB_单步和跟踪 FT_ AT_补丁 FP_ AP_声明:1、本文多数都是摘录和翻译,我只是重新组合并翻译,不会有人告侵权吧。
里面多是按自己的理解来说明,可能有理解错误,或有更好的实现方法,希望大家帮忙指出错误。
2、我并没有总结完全,上面的部分分类目前还只有很少的函数甚至空白,等待大家和我一起来完善和补充。
OPNET学习笔记
OPNET 14.5打开ODB调试窗口首先点击运行仿真的小人图表。
•在打开的窗口中如图示,先设置simulation kernel 为development.3. 在左边树状结构中找到Execution->debugger.4. 然后点击Run就可以了看到如下:5. 接下来就可以进行调试。
OPNET 14.5 与VC联调搞了好些天,头大!书上的内容全是10.0以前版本的设置方法,14.5版本变化太大,已经完全不适用了。
现在终于弄明白opnet 14.5如何和VC联调。
其实opnet14.5与VC联调不再需要另外特别的设置,不用再到edit—preference中去找这个找那个。
只需要设置好opnet和VC的环境变量就好。
一般的方法是ODB初始化以后,打开VC,在Debug 菜单下单击attach to process,然后选择op_runsim_dev.exe(或者op_runsim_opt.exe),这样就可以利用VC 提供的调试功能进行OPNET 程序调试。
一般情况下attach to process 选项框为空,这可能不是VC和OPNET程序本身的问题,因为有些应用软件的进程和op_runsim_dev.exe(或者op_runsim_opt.exe)进程冲突,如一些杀毒软件,acrobat 等,或者是其他进程开得过多所致。
这时打开任务管理器,找到op_runsim_dev.exe,右键选择调试。
这时会弹出VC。
弹出来的VC工程没有原代码,需要自己手打打开过程原代码,然后在代码中设置断点。
回到ODB中点击continue即可在断点出停止。
其实……就是这么简单……今天放弃了opnet 14.5 安装了10.0,可是安装后发现licence需要用opnet8.1的破解,又安装了8.1并破解,然后果断卸载,后来因为感觉缺少了不少功能,又使用11.5的破解程序,可是licence只有60个了,再次安装8.1,问题出现了,程序无法运行,纠结了一上午,发现,原来第一次卸载不彻底,第二次安装路径和第一次又不同,于是……解决方法:1,启动Modeler,观察dos窗口(用alt+prtscr,如果滚屏太快的话),记下错误的路径名。
易语言实现反OD调试反复附加的代码
易语⾔实现反OD调试反复附加的代码DLL命令表.版本 2.DLL命令 ZwQueryInformationProcess, 整数型, "NTDLL.DLL".参数 ProcessHandle, 整数型.参数 ProcessInformationClass, 整数型.参数 ProcessInformation, PROCESS_BASIC_INFORMATION.参数 ProcessInformationLength, 整数型.参数 ReturnLength, 整数型, 传址.DLL命令 OpenProcess, 整数型, "kernel32.dll", "OpenProcess".参数 dwDesiredAccess, 整数型.参数 bInheritHandle, 整数型.参数 dwProcessId, 整数型.DLL命令 CloseHandle, 整数型, , "CloseHandle".参数 hwnd, 整数型.DLL命令 GetProcessImageFileNameA, , "Psapi.dll", "GetProcessImageFileNameA".参数 ProcessHandle, 整数型.参数 lpFilename, ⽂本型.参数 nSize, 整数型.DLL命令修改虚拟保护, 整数型, "kernel32", "VirtualProtect", , 修改虚拟保护.参数 lpAddress, 整数型.参数 dwSize, 整数型.参数 flNewProtect, 整数型.参数 lpflOldProtect, 整数型, 传址.DLL命令取函数地址, 整数型, "kernel32", "GetProcAddress", , 返回函数地址.参数模块句柄, 整数型.参数函数名, ⽂本型.DLL命令取模块句柄, 整数型, "kernel32", "GetModuleHandleA", , 获取⼀个应⽤程序或动态链接库的模块句柄如执⾏成功成功,则返回模块句柄。
OPNET的ODB调试以及VC联调
OPNET的ODB调试、动态展示以及VC联调OPNET的ODB调试是非常强大的一个调试方法,操作界面类似DOS窗口,或者linux窗口,有很多指令可以选择,但是我觉得只用其中几个指令搭配上VC联调以及探测统计量,我们在OPNET的调试中就可以无往而不利!不过首先还是提供ODB调试的全过程链接吧:/zhoumhan_0351/blog/static/399542272009826105222389/分三点介绍:1、怎么进入ODB调试界面2、ODB动态展示3、VC联调一、怎么进入ODB调试:如图,点击这个小人的按钮,进入仿真界面:针对这个仿真界面,我们需要改动一些设计:然后,点击Run进入ODB界面:ODB操作界面:红框标出的就是指令的输入界面。
在这里输入help你可以看到所有的指令分类,如果想看更详细的就按照介绍的这样输入help <你想看的类或者指令>,如help<fulltrace>基于假设我们是在第13个事件报错(实际上这个工程没有bug,在这里主要是介绍一下流程),我们要输入一下指令,如图:这个指令是让它在第13个事件停止,继续输入指令:这个指令是让OPNET执行下去,然后继续输入指令:这个指令是让OPENT在第13个事件的仿真中,显示出所有的仿真过程:然后输入next/continue让仿真继续(因为我这里是没有错的,所以我只能输入next)。
输入了next之后,可以看到从这个事件开始,每个进程、函数、中断直行的过程:内容很多,不详细截图了。
二、动态展示:以上是ODB调试的基本介绍,下面继续介绍ODB调试的动态展示。
在左边窗口选择要观看的节点、或者进程选择model,下面的演示要勾上!如图:单击CLONE,将窗口复制出来,便于最大化观看!点击continue之后,我们可以看到,包的流动,如图:更进一步,我们可以选择观看进程的过程,黄色的表示仿真程序当前所在的位置:好了,动态展示到这里所有的步奏都讲完了,下面讲一下怎么VC联调。
ODB命令及使用
ODB命令及使用一、概述ODB(Object Database)是面向对象的数据库管理系统,它是基于对象的数据模型的数据库,在ODB中数据是以对象的形式存储和管理的。
ODB提供了一组命令和语法来操作和管理数据库中的对象。
二、常用命令1. 创建数据库:CREATE DATABASE [database_name]创建一个新的ODB数据库。
2. 连接数据库:CONNECT DATABASE [database_name]连接到已存在的ODB数据库。
3.断开连接:DISCONNECTDATABASE断开与当前数据库的连接。
4.显示数据库:SHOWDATABASES显示所有可用的ODB数据库列表。
5. 创建类:CREATE CLASS [class_name]创建一个新的对象类。
6.显示类:SHOWCLASSES显示所有已存在的对象类。
7. 插入对象数据:INSERT INTO [class_name] [column_name=value]向指定类中插入新的对象数据。
8. 更新对象数据:UPDATE [class_name] SET [column_name=value] WHERE [condition]更新类中满足条件的对象数据。
9. 删除对象数据:DELETE FROM [class_name] WHERE [condition]删除类中满足条件的对象数据。
10. 查询对象数据:SELECT * FROM [class_name] WHERE [condition]查询类中满足条件的对象数据。
11. 创建索引:CREATE INDEX ON [class_name]([column_name])在指定的列上创建索引。
12. 删除索引:DROP INDEX ON [class_name]([column_name])删除指定列上的索引。
13. 备份数据库:BACKUP DATABASE [database_name]备份指定的ODB数据库。
ODB Output Options
ODB++ Output OptionsSummaryOutput GeneratorOG0103 (v1.1) April 12, 2007ODB++ output options are configured in the ODB++ Setup dialog.ODB++ Output Setup OptionsFigure 1. The ODB++ Setup dialog displays layer stackups for embedded board arrays. Notice here that any compatibility violations display in red.Use the ODB++ Setup dialog to enable the specific layers that you wish to plot as part of the generated output. Use the Plot Layers button to access commands for quickly enabling/disabling all layers for plotting, or enabling only those layers that are used.ODB++ Output OptionsIn a similar fashion to Gerber file generation, you can also nominate which mechanical layer(s) are to be added to all ODB++ layer plots.The dialog also includes a field that allows you to specify the source that is to be used to create the ODB++ Profile layer. The Profile layer contains the enclosing boundary of the board. By default, this field is set to Board Outline. Also referred to as the board shape, this is a closed polygonal shape that defines the boundary, or extents, of the PCB. Created with each new PCB, this is perhaps the best source for creation of the Profile layer.If your design has no associated board shape, you can choose which source PCB layer has been used to define the closed polygon representing the boundary of the board (e.g. the KeepOut layer or a specific Mechanical layer).The Export only objects inside the board outline option becomes accessible only when the source PCB document contains an embedded board array object. As its name suggests, it provides control over the extent of objects exported. Note that if an object (e.g. text) is outside of, but touching the board outline, and this option is enabled, that object will still be exported.NotesUse the dialog's 'What's This Help' feature to obtain detailed information about each of the options available. Simply click on the question mark button at the top right of the dialog and then click over a field or option to pop-up information specific to that field or option.ODB++ output can be generated in one of two ways:•Using an appropriately configured output generator defined in an Output Job Configuration file (*.OutJob). Output will be generated upon running the configured output generator•Directly from within the active PCB document using the File » Fabrication Outputs » ODB++ Files menu command. Output will be generated immediately upon clicking OK in the ODB++ Setup dialog.Note: The settings defined in the ODB++ Setup dialog when generating output directly from the PCB are distinct and separate to those defined for the same output type in an Output Job Configuration file. In the case of the former, the settings are stored in the project file, whereas for the latter they are stored in the Output Job Configuration file.When generating ODB++ output, you can specify that the output be opened automatically in a new CAMtastic document. The way in which this is accomplished depends on how you are generating the output:•From an Output Job Configuration file - enable the ODB++ Output auto-load option in the Output Job Options dialog (Tools » Output Job Options from the OutputJob Editor)•Directly from the PCB - ensure that the Open outputs after compile option is enabled on the Options tab of the Options For Project dialog (Project » Project Options).ODB++ Output OptionsThe ODB++ format uses a standard file system structure. A job in ODB++ is represented by a self standing directory tree, which means the job tree can be transferred between computer systems without loss of data. All files in ODB++ are readable ASCII files.A database job is a single folder (odb), composed of the following sub-folders: fonts, input, matrix, misc, steps, symbols and user.The steps folder contains various sub-folders including the folder layers, which contains output for each layer enabled for plotting in the ODB++ Setup dialog, as well as drill information and component information.The symbols folder has single layer graphic entities which can be referenced from within any graphical layer in a step.The matrix folder has definitions of the physical order of the layers and the relation of drill layers (through, blind, buried etc).The user folder will contain the generated DRC Rules file (*.drc), if the option to generate this file was enabled in the ODB++ Setup dialog.When generating ODB++ output from the PCB design, all objects on all layers enabled for plotting will be exported. If you only want to export design objects residing within the board outline, ensure that all additional layers containing objects outside of this boundary are disabled with respect to plotting.ODB++ Output OptionsWhen generating ODB++ output from a PCB design that contains embedded board arrays (shown in Figure 1), the design is analyzed automatically for layer stackup violations.•Embedded boards that are flipped will display their layer stacks as flipped.•Mid signal layers and internal planes that are different can still appear on the same mid layer panel.•Mid signal layers and internal planes can be flipped against each other.The output path for generated files is set in the Options tab of the Options for Project dialog. By default, the output path is set to a sub-folder under the folder that contains the Project file and has the name: Project Outputs for ProjectName. The output path can be changed as required. If the option to use a separate folder for each output type has been enabled in the Options tab, then the ODB++ files will be written to a further sub-folder, named: ODB Output.When generated, the output will be added to the project and appear in the Projects panel under the Generated folder, in an appropriately-named sub-folder. If you have used a separate folder for each output type, then corresponding (separate) Generated folders will be added to the Projects panel (e.g. Generated (ODB Output)).Revision HistoryDate Version No.Revisionrelease05-Dec-2005 1.0 New12-Apr-2007 1.1 Updated for Altium Designer 6.7Software, hardware, documentation and related materials:Copyright © 2007 Altium Limited.All rights reserved. You are permitted to print this document provided that (1) the use of such is for personal use only and will not be copied or posted on any network computer or broadcast in any media, and (2) no modifications of the document is made. Unauthorized duplication, in whole or part, of this document by any means, mechanical or electronic, including translation into another language, except for brief excerpts in published reviews, is prohibited without the express written permission of Altium Limited. Unauthorized duplication of this work may also be prohibited by local statute. Violators may be subject to both criminal and civil penalties, including fines and/or imprisonment. Altium, Altium Designer, Board Insight, Design Explorer, DXP, LiveDesign, NanoBoard, NanoTalk,P-CAD, SimCode, Situs, TASKING, and Topological Autorouting and their respective logos are trademarks or registered trademarks of Altium Limited or its subsidiaries. All other registered or unregistered trademarks referenced herein are the property of their respective owners and no trademark rights to the same are claimed.。
adb调试方法
adb调试方法宝子们,今天咱来唠唠adb调试这事儿。
adb呢,就是Android Debug Bridge,它就像一个神奇的小助手,可以让你跟你的安卓设备有更多互动哦。
那怎么开始adb调试呢?咱得先把adb工具准备好。
一般来说呢,如果你是开发者,在安卓的SDK里就有这个工具啦。
要是普通小伙伴,可能得在网上找找适合自己设备和电脑系统的版本。
找到之后呢,你得把你的安卓设备和电脑连接起来。
这时候要注意哦,有的手机需要打开开发者选项,这个开发者选项就像一个神秘的小开关。
怎么打开呢?不同手机不太一样,不过大多是在手机的设置里,关于手机那个部分,然后猛戳版本号好多下,就像敲开一扇隐藏的门一样,开发者选项就出来啦。
在开发者选项里,还要打开USB调试模式,这就相当于给电脑和手机之间搭了一座小桥梁。
设备连接好电脑后,我们就可以在电脑的命令提示符或者终端里操作adb命令啦。
比如说,你想看看你的设备有没有被电脑识别到,就可以输入“adb devices”。
如果看到你的设备列表在那里,哇塞,就成功一半啦。
如果想在设备上安装个软件,那就可以用“adb install [软件的路径]”这样的命令。
就像你轻轻一挥手,软件就跑到手机里去啦。
要是想从手机里把数据导出来,也有对应的命令哦。
宝子们可能会担心操作出错。
其实呀,只要小心一点,按照步骤来,一般不会有啥大问题的。
就算出错了,也别慌,仔细看看命令提示符或者终端里的提示信息,就像它在给你悄悄说哪里出问题了呢。
adb调试就像是一场你和安卓设备的小秘密互动。
它能让你对自己的手机或者平板有更多的掌控权。
虽然一开始可能觉得有点复杂,但是玩着玩着就会觉得超有趣的。
宝子们,大胆去尝试一下吧,说不定会发现一个全新的安卓小世界哦。
。
[转]用ollydbg实现源码级调试[文字模式]
[转]用ollydbg实现源码级调试[文字模式][转]用ollydbg实现源码级调试linhanshi2004-12-17, 17:41:15by +immlep+E-mail:immlep[at]126[dot]com原文出处:/User14/immlep/index.html在论坛上经常看到有些人在问怎么样用ollydbg实现源码级调试!以前我没常用ollydbg,所以自己也没有注意这些问题,现在用得比较惯,所以也就把它的各个功能看了,发现用ollydbg来调试有源代码的程序还挺好用的,至少我觉得比vc什么的自带的调试器好用多了!在此写出来和大家分享一下,其实这些都是很容易的,只不过之前没有多少人写出来,至于我自己写出来也只是起到一个抛砖引玉的作用而已!没有什么技术性可言!而且中间可能有多个错误,那么其中涉及到的一些问题就需要你自己去解决了,我也希望如果你发现什么比较好的技巧的话,可以告诉我一声!在本文中我测试的是用vc++以debug编译的程序(不能用Release方式编译,否则无法结合代码调试)!至于用其它编译器编译的软件我还没试过!你可以自己试一下!首先我们新建debug example.cpp,代码如下:以下内容为程序代码:#include "windows.h"void main(){MessageBox(NULL,"debug example for cpp\nwelcome to ","Test",MB_OK);return;}用vc++以debug方式编译程序,这时在你的工程目录下会生成debug目录,现在你就可以用ollydbg来调试了(就怎么简单)!用ollydbg打开debug目录下的debug example.exe,这时你会发现,ollydbg显示的内容很详细!入口点处的部分代码:以下内容为程序代码:004010B0 >/ 55 PUSH EBP004010B1 |. 8BEC MOV EBP,ESP004010B3 |. 6A FF PUSH -1004010B5 |. 68 30F14100 PUSH debug_ex.0041F130004010BA |. 68 A42B4000 PUSH debug_ex._except_handler3 ; SE handler installation004010BF |. 64:A1 0000000>MOV EAX,DWORD PTR FS:[0]004010C5 |. 50 PUSH EAX004010C6 |. 64:8925 00000>MOV DWORD PTR FS:[0],ESP004010CD |. 83C4 F0 ADD ESP,-10004010D0 |. 53 PUSH EBX004010D1 |. 56 PUSH ESI004010D2 |. 57 PUSH EDI004010D3 |. 8965 E8 MOV DWORD PTR SS:[EBP-18],ESP004010D6 |. FF15 88414200 CALL NEAR DWORD PTR DS:[<&KERNEL32.GetVersion>] ; KERNEL32.GetVersion 004010DC |. A3 E0254200 MOV DWORD PTR DS:[_osver],EAX 004010E1 |. A1 E0254200 MOV EAX,DWORD PTR DS:[_osver] 004010E6 |. C1E8 08 SHR EAX,8004010E9 |. 25 FF000000 AND EAX,0FF004010EE |. A3 EC254200 MOV DWORD PTR DS:[_winminor],EAX004010F3 |. 8B0D E0254200 MOV ECX,DWORD PTR DS:[_osver]004010F9 |. 81E1 FF000000 AND ECX,0FF004010FF |. 890D E8254200 MOV DWORD PTR DS:[_winmajor],ECX00401105 |. 8B15 E8254200 MOV EDX,DWORD PTR DS:[_winmajor]0040110B |. C1E2 08 SHL EDX,80040110E |. 0315 EC254200 ADD EDX,DWORD PTR DS:[_winminor]00401114 |. 8915 E4254200 MOV DWORD PTR DS:[_winver],EDX0040111A |. A1 E0254200 MOV EAX,DWORD PTR DS:[_osver] 0040111F |. C1E8 10 SHR EAX,1000401122 |. 25 FFFF0000 AND EAX,0FFFF00401127 |. A3 E0254200 MOV DWORD PTR DS:[_osver],EAX 0040112C |. 6A 00 PUSH 0 ; /Arg1 = 000000000040112E |. E8 8D180000 CALL debug_ex._heap_init ; \_heap_init00401133 |. 83C4 04 ADD ESP,400401136 |. 85C0 TEST EAX,EAX00401138 |. 75 0A JNZ SHORT debug_ex.004011440040113A |. 6A 1C PUSH 1C0040113C |. E8 CF000000 CALL debug_ex.0040121000401141 |. 83C4 04 ADD ESP,400401144 |> C745 FC 00000>MOV DWORD PTR SS:[EBP-4],0 0040114B |. E8 00150000 CALL debug_ex._ioinit现在我们就要进入重点了,在ollydbg中打开View-->Source files!这是你会发现这样的列表:Source filesModule Source Source pathdebug_ex (Absent) G:\crack\zz\Debug\sbheap.cdebug_ex (Absent) G:\crack\zz\Debug\dbgheap.cdebug_ex (Absent) G:\crack\zz\Debug\osfinfo.cdebug_ex (Absent) G:\crack\zz\Debug\mbctype.cdebug_ex (Absent) G:\crack\zz\Debug\a_map.cdebug_ex (Absent) G:\crack\zz\Debug\crt0msg.cdebug_ex (Absent) G:\crack\zz\Debug\_flsbuf.cdebug_ex (Absent) G:\crack\zz\Debug\dbgrpt.cdebug_ex (Absent) G:\crack\zz\Debug\winsig.cdebug_ex (Absent) G:\crack\zz\Debug\malloc.cdebug_ex (Absent) G:\crack\zz\Debug\wctomb.cdebug_ex (Absent) G:\crack\zz\Debug toa.cdebug_ex (Absent) G:\crack\zz\Debug\crt0dat.cdebug_ex (Absent) G:\crack\zz\Debug\lseek.cdebug_ex (Absent) G:\crack\zz\Debug\crtmbox.cdebug_ex (Absent) intel\ullrem.asmdebug_ex (Absent) G:\crack\zz\Debug\fclose.cdebug_ex (Absent) G:\crack\zz\Debug\vsprintf.cdebug_ex (Absent) G:\crack\zz\Debug\fflush.cdebug_ex (Absent) G:\crack\zz\Debug\_file.cdebug_ex (Absent) G:\crack\zz\Debug\isatty.cdebug_ex (Absent) G:\crack\zz\Debug\a_env.cdebug_ex (Absent) G:\crack\zz\Debug\heapchk.cdebug_ex (Absent) G:\crack\zz\Debug\dbghook.cdebug_ex (Absent) G:\crack\zz\Debug\write.cdebug_ex (Absent) G:\crack\zz\Debug\_getbuf.cdebug_ex DEBUG EXAMPLE.CPP G:\crack\zz\debug example.cppdebug_ex (Absent) G:\crack\zz\Debug\winxfltr.cdebug_ex (Absent) G:\crack\zz\Debug\stdargv.cdebug_ex (Absent) G:\crack\zz\Debug\output.cdebug_ex (Absent) intel\chkstk.asmdebug_ex (Absent) intel\memset.asmdebug_ex (Absent) G:\crack\zz\Debug\_freebuf.cdebug_ex (Absent) G:\crack\zz\Debug\crt0fp.cdebug_ex (Absent) G:\crack\zz\Debug\handler.cppdebug_ex (Absent) intel\strlen.asmdebug_ex (Absent) G:\crack\zz\Debug\a_str.cdebug_ex (Absent) G:\crack\zz\Debug\heapinit.cdebug_ex (Absent) G:\crack\zz\Debug\dosmap.cdebug_ex (Absent) intel\ulldiv.asmdebug_ex (Absent) G:\crack\zz\Debug\sprintf.cdebug_ex (Absent) G:\crack\zz\Debug\commit.cdebug_ex (Absent) Intel\MEMCPY.ASMdebug_ex (Absent) G:\crack\zz\Debug\close.cdebug_ex (Absent) G:\crack\zz\Debug\closeall.cdebug_ex (Absent) intel\memcpy.asmdebug_ex (Absent) G:\crack\zz\Debug\realloc.cdebug_ex (Absent) G:\crack\zz\Debug\ioinit.cdebug_ex (Absent) G:\crack\zz\Debug\expand.cdebug_ex (Absent) G:\crack\zz\Debug\free.cdebug_ex (Absent) G:\crack\zz\Debug\isctype.cdebug_ex (Absent) G:\crack\zz\Debug\crt0.cdebug_ex (Absent) intel\strcat.asmdebug_ex (Absent) G:\crack\zz\Debug\stdenvp.cdebug_ex (Absent) intel\strncpy.asm看到了DEBUG EXAMPLE.CPP没有?!双击它,怎么样,是不是看到了:在这里就可以查看代码了,而且还显示出了每行代码的行号!双击它就可以来到该代码对应的汇编代码处了,你也可以直接在源代码上下断点,到了这里是不是很熟悉了!我们这里先来试试!以下内容为程序代码:1.#include "windows.h"2.3.void main()4.{5.6. MessageBox(NULL,"debug example for cpp\nwelcome to ","Test",MB_OK);//就用这一句开刀吧!7.8. return;9.}10.11.在第六行按F2下断点,双击来到了对应的汇编代码处:以下内容为程序代码:00401028 |. 8BF4 MOV ESI,ESP0040102A |. 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL0040102C |. 68 38F04100 PUSH debug_ex.0041F038 ; |Title = "Test"00401031 |. 68 5CFF4100 PUSH debug_ex.0041FF5C ; |Text = "debug example for cppwelcome to "00401036 |. 6A 00 PUSH 0 ; |hOwner = NULL00401038 |. FF15 8C424200 CALL NEAR DWORD PTR DS:[<&USER32.MessageBoxA>] ; \MessageBoxA按F9执行一下看看!断在00401028处!在ollydbg里还可以看到:ESP=0012FF34ESI=00000000debug example.cpp:6. MessageBox(NULL,"debug example for cpp\nwelcome to ","Test",MB_OK);怎么样,哪个文件,哪一行代码,连代码是什么都显示出来了!爽不爽!间不简单!?当然用ollydbg调试不仅仅只有上面所说的功能,它还有其它的功能,这个你自己去看看就可以去了解!WiNrOOt2004-12-17, 18:32:30个人觉得:对于3环的源码级调试最好的工具就是IDE集成的调试器那才叫真正的源码级调试。
网络仿真
1驱动机制:离散事件驱动2仿真包格式:前导、数据、域、标签3OPNET家族产品适用对象:opnetMolder为技术人员提供一个网络技术和开发平台ITGuru帮助专业人士分析和预测网络性能,诊断问题查找瓶颈提出解决方案SPGuru面向网络服务提供商以智能化网络管库软件WDMGuru 用于波分复用光纤网络的分析测试4仿真流程:初始化定义--数据收集和仿真--重定义5项目编辑器用于开发网络模型(包括子网模型节点模型)。
具有基本的方针和分析能力6节点编辑器定义网络中节点模型,使用不同模块描述节点对象不同模型,展示网络设备和系统体系结构7进程编辑器用于创建进程模型,使用强大的有限状态机来支持规范、协议、应用、算法及排队策略8链路模型编辑器用于创建编辑和查看链路模型。
链路类型:点到点双工链路,点到点单工链路,总线链路和接头链路9探针编辑器用于指定仿真过程中需要采集的统计量10对象是一个部件或一个模型的构建模块,部件或模型由一个或多个对象组成属性:每个属性都有一个特定范围唯一标识该属性的名称,属性只是一个数据项,用于对象配置和用户配置。
属性还是一个性质集合,以指定它的使用规则和其他附加功能11模型属性:属性除了用来描述度向外还能与模型相关联,作为模型属性来表征模型的参数。
模型属性克服了固化属性值的弱点,为模型提供属性参数能够增加模型的通用性和重用性12属性提升:上层模型由下层模型实例化后的若干对象组成。
提供模型属性的另一种机制允许下层对象的属性向上向上传递给上层模型,该机制称为属性提升13派生模型:模型派生操作已有模型,生成一个与已有模型具有不同接口的新模型14包的结构:格式化、非格式化、数值矢量15包的传输机制:包流,包传递,通信链路,链路模型16ICI通信:接口控制信息,有一系列数据项组成的数据对象16OPNET子网:子网将网络中的每一个节点和链路抽象出来,组成一个实体17统计线:同一节点模块的源端口和另一模块的目的端口间的物理连接18链路编辑器的类型:点到点双工链路,点到点单工链路,总线链路和接头链路19探针编辑器的类型:节点统计量,链路统计量,全局统计量,仿真属性,自动动画,用户动画,统计动画20ODB:仿真调试器,内核的一部分,自动与每个方针进行连接odb调用方式:在OPNET Console中通过命令行的方式调用。
ABAQUS+Python+Script中ODB处理手册
ABAQUS Python Script 中Odb处理手册1 Odb操作命令:1.1 Odb对象1.1.1 进入Odb对象的途径import odbAccesssession.odbs[name]1.1.2 Odb()该方法创建一个新的Odb对象,格式为:session.Odb()A.必须参数1)name:用于指定生成的Odb对象的名称B.选填参数1)analysisTitle:用于指定输出数据库的标题的字符串,默认值为空的字符串;2)description:用于描述输出数据库的字符串,默认值也为空的字符串;3)path:用于指定输出数据库的路径,默认值也为空的字符串;C.返回值返回一个Odb对象1.1.3 close()该方法用于关闭一个输出数据库。
【注】:该方法无返回值,也无参数。
1.1.4 getFrame()该方法返回指定时间的frame,该方法不适用于在不同分析步具有不同模型的Odb文件。
A.必须参数frameValue:用于指定需要哪个frame的浮点数,该值可以是total timeB.选填参数match:符号常量,用于指定假如没有找到frameValue所指定的frame,哪个frame被返回,可能取值为:CLOSES T、BEFORE、AFTER、EXACT,默认值为:CLOSESTC.返回值一个OdbFrame对象1.1.5 save()该方法用于保存输出到Odb文件中。
【注】:该方法无返回值,也无参数。
1.1.6 update()该方法用于将分析得到的增加的分析步和增量步写入到Odb文件中。
A.返回值返回一个布尔值,用于指定是否有额外的分析步或增量步被写入到Odb对象中。
【注】:该方法无参数。
1.1.7 成员1) isReadOnly:布尔值,用于指定是否Odb文件以只读形式打开;2) interactions:一个库,用于存储Interaction对象;3) interactionProperties:一个库,用于存储InteractionProperty对象;4) amplitudes:一个库,用于存储Amplitude对象;5) filters:一个库,用于存储Filter对象;6) rootAssembly:一个OdbAssembly对象;7) jobData:一个JobData对象;8) parts:一个库,用于存储OdbPart对象;9) materials:一个库,用于存储Material对象;10) steps:一个库,用于存储OdbStep对象;11) sections:一个库,用于存储Section对象;12) sectionCategories:一个库,用于存储SectionCatagory对象;13) sectorDefinition:一个SectorDefinition对象;14) userData:一个UserData对象;15) customData:一个RepositorySupport对象;16) profiles:一个库,用于存储Profile对象;1.2 FieldLocation对象该对象用于指定场中那些可用数据的位置,例如,位移场中,存在一个FieldLocation对象,该对象有一个NODAL的成员。
AndroidSo动态调试之反jdb附加的解决大法
AndroidSo动态调试之反jdb附加的解决大法今天国庆的第六天,西安淅淅沥沥小雨下个不停,索性卧在床上不如品一杯西湖龙井,更新一篇博客,一来帮助需要之人;二来加深自己的理解。
问题篇:在上一篇中讲到了关于Android so的动态调试,没看的可以点这里:点击打开链接;我自认为写的还是挺全的,在上文中我们说到关于最后一步jdb 附加调试时,很多时候都会出现附加不上的问题,使人很闹心。
于是这一篇就是专门关于这个问题进行展开的。
解决这个问题方法有很多,我是按照自己认为的优良答案顺序展开的,都是借鉴网上的各路大神而总结的。
解决篇:根据android的官方文档,如果调试一个APK,必须满足以下两个条件中的任何一个:1.APK的AndroidManifest.xml文件中的Application标签包含android:debuggable="true";2./default.prop中的ro.debuggable的值为1;方法一:在已经root的手机安装Xposed框架和xinstaller插件目的:就是利用Xposed的HOOK插件xinstaller开启系统中所有应用的调试功能。
使用方法:第一步:下载Xposed框架,并激活,再下载xinstaller插件安装;第二步:开启模块,点击xinstall插件设置专家模式,进入其他设置,开启调试应用,最后在xposed中激活重启,OK!!关于框架和xinstaller插件会放在附件中。
方法二:修改android:debuggable="true"用AK反编译以后在AndroidManifest.xml文件中的Application 标签中加入android:debuggable="true";然后回编译。
这个方法虽然简单,但是问题多,比如:第一:有的反编译,签名验证等等。
第二:如果说软件已经爱加密或加壳了,修改XML几乎是不可能的,因为改了也不能回包于是引入了方法三.方法三:如果我们在真机,则可以修改根目录下的default.prop文件,将里面的ro.debuggable =1。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
原文链接:/zhoumhan_0351/blog/static/399542272009826105222389/(本文图片需用鼠标点击方可看到,其他转帖图片根本无法看到)整理:袁嘉璐10、OpNET的ODB调试1)基本概念日志文件:仿真日志(DESlog,DiscreteEventSimulationlog)和错误日志(Errorlog)。
它的内容是在仿真过程中由进程调用OPNET函数op_prg_log_handle_create()op_prg_log_entry_write()写入的。
在Help菜单下可以打开错误日志文件。
错误日志文件以文本方式保存为<home>/op_admin/err_log,除了在菜单中打开也可以在OPNET控制台(console)窗口输入op_vuerr命令查看。
它包含了函数调用堆栈信息,我们可以从函数阶层性的调用关系中精确定位出错位置。
在编写函数时必须使用FIN(functionbegin)、FOUT(functionout)、FRET (functionreturn)等界定函数范围的标识符,而且必须使它们配对。
编写程序时切记使FIN和FOUT/FRET配对。
要产生ODB调试信息,必须将仿真核心类型设定为development,优化的仿真核心(optimized)为了加快仿真速度不产生ODB调试信息。
之后我们还需要在仿真属性中包含debug环境变量。
ODB为控制和管理仿真行为提供一个交互式环境。
ODB支持断点(Breakpoint)定义,跟踪并显示仿真诊断信息。
ODB功能的实现有赖于进程模型中编写相应的程序支持,作为ODB指令激活调试状态(breakpoint、trace和action)的依据,可以在ODB窗口中输入help<参数:all,basic,action,event,memeory,misc,object,packet,process,scripting,stop,trace>查看感兴趣的指令。
ODB常用的指令分为basic,event,object,packet,stop,trace,process几类。
Basic类指令主要包含了一些基本的操作;Event类指令主要针对事件进行操作;Object 类指令主要针对各类对象(如节点,信道等)进行操作。
Packet类指令处理所有与包相关的操作。
proldiag带的参数有2个,分别是进程ID和标签(label)。
它的效果等同于3条指令的叠加,首先ltrace激活标签;然后prodiag执行进程诊断块中的程序,并且打印标签被激活程序段的信息;最后,在执行完程序后deltrace取消对标签的跟踪。
deltrace取消对某个标签的跟踪,与激活标签不同的是,它带的参数为trace_id,而不是标签本身,但是trace_id是系统分配的,不为我们所知,需要通过输入status指令查看。
2)针对结构错误(StructuralError)的ODB调试实例我们得知是第13个事件出错我们让仿真停止在第13个事件执行之前,如下所示,在事件栏中我们看到当前中断类型为流中断,另外还有两个ID号,其中executionID为当前事件ID,scheduleID标明当前事件处在仿真核心事件列表中的位置,这两个值可能不相同,因为随着事件的增加和消减,仿真核心列表是不断变化的。
Source指明了当前中断源,例如这里表明中断是由全球网top下的pksw1子网下的node_0节点下的src进程模块在执行事件9时发出来的。
Data指明了与当前中断相关的信息,这里表明封包是从1号流端口接收来的,封包的ID为0。
Module指明当前中断的接收方,top.pksw1.node_0.proc(processor)指明了物件的阶层关系和类型,OPNET中最高层物件永远为top,代表全球网。
接着将执行第13个事件,为了观察间中执行的代码,我们启动完全跟踪(fulltrace),之后输入status命令就可以查看已设定的中断和跟踪有哪些。
接下来输入next命令,让仿真执行下一个事件。
从进程信息栏中我们可以看出当前进程(Invokingprocess)的ID号为1,进程模型的名称为pksw_nd_proc。
进程收到中断后将执行红色idle状态的窗口执行代码(exitexecutives),首先判断中断的类型为流中断,接着获取流中断索引号,其值为1。
执行完之后满足条件SRC_ARRVL,从idle状态再次转移到idle状态,同时执行条件子程序xmt(),间中试图从0号流索引的包流中获取封包,这时我们已经看出一些端倪,应该是从1号流索引收包才对,果然指示包流中并没有数据包(strm.isempty),接着出现封包指针为空的错误提示,因此op_pk_nfd_set_int32代码肯定不能正常运行。
到这里我们找到了错误所在,只要把op_pk_get(0)改为op_pk_get(1)就行了。
注意到最后两行的提示Press(ENTER)tocontinue。
这是在edit->preference中,console_exit_pause设定为TRUE带来的结果。
2)针对逻辑错误的ODB调试实例例如某个端口正常情况下应该收到数据包,吞吐量却为零。
我们通过pktrace命令启动对PacketID为1的封包的跟踪,pktrace跟踪有关包的所有执行语句,直至包被销毁。
在新版的OPNET中支持对包设置断点,任何涉及到处理封包的事件到达时仿真都会停下来,如下图所示,要推进事件必须再次输入继续仿真的命令(cont或者next),这样让我们清晰查看包在每个事件中的行为。
下面我们再次输入cont命令,包被top.pksw1.node_1.src进程模块创建,接着被top.pksw1.node_1.proc进程接收并将其dest_address域设定为1,如下图方框所示,之后被传输到底层。
接着我们再连续输入cont命令,直到包被交换机节点进程(top.pksw1.hub.hub)接收,发现包的dest_address被修改为0,如图所示。
我们仔细想一下交换机应该取出包的目的地址,根据目的地址再选择正确的路由,而不是去重新设置,这时我们已经找到了这个逻辑上的错误,只要将op_pk_nfd_set_int32改为op_pk_nfd_get_int32问题就解决了。
3)针对进程模块的ODB调试由于进程是实现整个仿真的基础,因此针对进程的调试是ODB调试的主要内容,主要包括四个部分,分别是定位进程、控制进程、跟踪进程及显示进程状态。
(1)定位进程(11)promap<Objid>显示指定进程模块包含的所有进程的ProcessID。
(12)promapall显示所有仿真中存在的进程ProcessID,如图所示。
进程标记,用来更直观地区别同种类型进程(父进程产生多个进程,这些进程是由同一个进程模型派生而来的),使用这种方法必须在进程模块中通过op_pro_tag_set(pro_handle,tag_string)来设置进程标记。
(2)控制进程ODB调试时输入指令prostop<proc_id>为进程调用设置断点。
无论什么中断,只要调用该进程,仿真都会暂时中断。
首先在进程模型中通过op_prg_odb_bkpt(label)为指定位置设置断点,这个断点以标签(label)标识,ODB调试过程中如果通过prolstop<proc_id><label>激活了该断点标签,则仿真会在被设置标签的位置中断。
(3)跟踪进程(31)protrace<proc_id>跟踪并显示调用指定进程的信息。
(32)ltrace<label>是最实用的调试指令,例如如果想找到程序中的逻辑错误,可以在可疑的程序段中加入这样一个语句。
if(op_prg_odb_ltrace_active("label")==OPC_TRUE){printf(...)},printf打印需要观察的变量,在ODB中激活标签就可以看到仿真中这些变化的情况。
(33)proltrace<proc_id><label>显示指定进程中设置过某个标签的位置所对应的信息。
(4)显示进程状态(41)在进程的诊断块(Diagnosticblock)中编写与调试相关的程序后,ODB 调试时就能通过prodiag<proc_id>执行诊断块对应的程序,从而显示调试信息。
(42)proldiag<proc_id><label>指令相当于prodiag<proc_id>与ltrace<label>的叠加。
ODB>objmapprocdp查看进程对象的信息,dp为进程的名字。
ODB>promap2查看进程模块当前被激活的进程信息,其中2为Objid。
ODB>prostop0为进程设置断点,其中0为processidODB>protrace0激活进程跟踪信息显示,其中0为processidODB>status显示指令状态。
ODB>cont,继续执行事件直至仿真运行到断点位置。
ODB>next,执行下一个事件。
子进程dp_child中的有设置进程标记的语句:sprinf(tag_string,"DynProcChild(stream%d)",op_intrpt_strm());根据包流的输入端口索引号制定进程标记tag_stringop_pro_tag_set(op_pro_self(),tag_string);为进程自身设置标签。
ODB>delstopallODB>deltraceallODB>status,再次显示指令状态,发现断点已经被取消ODB>prolstop6"dynproc_50"这时激活进程6的断点标签,当执行到进程中的op_prg_odb_bkpt("dynproc_50")语句时程序中止运行。
ODB>prodiag6,运行进程诊断块的代码。