程序调试

痞子衡嵌入式:飞思卡尔i.MX RTyyyy系列MCU硬件那些事(2.2)- 在串行NOR Flash XIP调试原理

ぃ、小莉子 提交于 2019-12-03 10:39:07
  大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是 飞思卡尔i.MX RTyyyy系列EVK在串行NOR Flash调试的原理 。   本文是i.MXRT硬件那些事系列第二篇的续集,在第二篇首集中痞子衡给大家详细介绍了EVK板载调试器用法,有了调试器在手,从此调试不用愁。从调试代码所在目标存储器类别上来分,调试一般分为在SRAM调试和在Flash调试。在SRAM调试实现比较简单,程序直接从JTAG/SWD口灌进RAM即可;在Flash调试,则相对复杂一点,因为首先需要有Flash下载算法,下载成功后才能调试。   通常的Cortex-M内核MCU一般都会内嵌并行NOR Flash,这个并行NOR Flash是直接挂在Cortex-M内核高性能AHB总线上的,知名IDE如果支持这款MCU,也都会同时集成对应Flash的下载算法,方便用户直接在IDE里下载代码进Flash和XIP调试,但是i.MXRT内部并没有Flash,用户需要自己外接Flash,那该怎么办?还能在线XIP调试么?别着急,i.MXRT可以支持外接并行NOR和串行NOR实现XIP,从节省管脚数的角度,最常见的做法是将串行NOR Flash挂在i.MXRT FlexSPI总线上,FlexSPI支持XIP特性,所以原理上可以实现在线调试,今天痞子衡就为大家介绍i.MXRT上在外部串行Flash调试的原理:

Python 3.7的新特性

☆樱花仙子☆ 提交于 2019-12-03 06:58:42
Python 3.7为数据处理、脚本编译和垃圾收集优化以及更快的异步I/O添加了许多新类。 python是一种旨在简化复杂任务的语言。python 3.7的最新版本已经正式 休闲鹿 进入beta发布阶段。Python3.7的最终版本将于2018年6月发布,但之后Python3.7将不再增加新功能。 python 3.7最重要的新增和改进如下: 使用类时减少样板代码中的数据类数。 可能不向后兼容的更改涉及处理生成器中的异常。 面向解释器的“开发模式”。 具有纳秒分辨率的时间对象。 环境中默认使用utf-8编码的utf-8模式。 触发调试器的新内置函数。 Python数据类 众所周知,Python是处理结构化数据的一种快捷方便的方法python提供类来组织管理结构并将常见行为与数据实例关联起来,但是具有许多初始值设定项的类有一个长期的缺点:它们需要大量样板代码来创建。 所以生成的类就像一个普通的Python类一样运行您还可以声明某些字段是“冻结”或不可变的,并自动(或手动重写)创建属性的特殊方法,例如“hash”或“repr.”。 Python生成器异常处理 如PEP 479(https://www.python.org/dev/peps/PEP-0479/)所述,随着时间的推移,开发了一个更改,使人们更容易调试python生成器引发的stopiteration异常以前

bochs 调试 com 文件 magicbreak

南楼画角 提交于 2019-12-03 05:08:25
转自 https://blog.csdn.net/housansan/article/details/41833581 在网上看到2中解决此问题的方法: 1.使用dos下的debug32工具单步跟踪pmtest2.com的运行情况。但这个方法存在问题,当跟踪到mov cr0,eax语句时freedos会错误,无法继续跟踪下去。 2.使用bochs的magic_break,方法如下: 在Bochs的配置文件里加上一句magic_break: enabled=1,然后在程序里加上一句xchg bx,bx,运行到这条指令时会断到Bochs调试器里(在Bochsrc_sample.txt里)。 网上的留言的大侠使用该方法成功了,可惜我没成功,网上回了个贴,说了一下自己的操作流程,等待回复中。 今天终于把这个方法实验成功了,前面失败的原因是没有把新编译成的pmtest.com文件拷贝到pm.img文件中。下面把整个步骤完整的列一下: 1)修改bochsrc文件。 在文件末尾增加“magic_break: enabled=1” 2)pmtest.asm文件中增加语句xchg bx, bx,选了2个地方都没有成功 org 0100h ;xchg bx, bx ;我选的位置 jmp LABEL_BEGIN 3)用nasm编译新该的asm文件,并拷贝到pm.img中 sudo mount -o

调试指南

余生长醉 提交于 2019-12-03 04:43:05
调试指南 由于图床一些问题,本篇博客暂时不添加图片,可以自行运行代码片段查看运行结果。 一、预处理指令的妙用 参考文献: 爽文219 1、使用ifdef 注释 只有在宏定义了ifdef后判断的内容时,使用ifdef和endif括住的内容才会被编译运行。 样例: int main() { #define lky233 #ifdef lky233 freopen("testdata.in", "r", stdin); freopen("testdata.out", "w", stdout); #endif int a, b; cin >> a >> b; cout << a + b << endl; } 除了使用define进行宏定义,还可以在编译命令中添加 -D *** 实现。 例如:-D lky233 另外,ifndef表示若没有定义。 样例: int main() { #define lky233 #ifndef lky233 freopen("testdata.in", "r", stdin); freopen("testdata.out", "w", stdout); #endif int a, b; cin >> a >> b; cout << a + b << endl; } 还有就是,一般常用的OJ都有宏定义ONLINE_JUDGE。 (HOJ也有的) 2、define

Python-调试&单元测试

久未见 提交于 2019-12-03 03:43:50
一、调试技术 (1)调试流程​:单元测试->集成测试->交测试部 (2)分类:i.静态调试(说白了就是看代码,看看有没有错);ii.动态测试 1.pdb调试 ​相关连接: https://blog.csdn.net/xc_zhou/article/details/80921483 作者:周小董 2.pycharm调试 含有两种模式:(1)run/debug模式 断点:程序的某一行,程序在debug模式下,进行调试 例子: [url=] [/url] #debug模式def SayHello(name): print("I want to say hello with your,{0}".format(name)) print("Hello,{0}".format(name)) print("Done....")if __name__=="__main__": print("****"*10) name = input("Please input your name:") print(SayHello(name=name)) print("@@@"*10) [url=] [/url] ​下面将进行调试: (1)pycharm有两个按钮run和debug run是直接运行我们的代码,debug就是调试我们的代码 (2)我们要调试某一行,那就在那一行的行号位置单击一下

IDA 对 so 的动态调试

匿名 (未验证) 提交于 2019-12-03 00:41:02
将IDAPro根目录下dbgsrv 目录下的android_server(模拟器用android_x86_server,这里还是用真机好点)文件push 到安卓设备(比如/data/local/tmp/目录)下,权限改为777,并运行 端口转发adb forward tcp:23946 tcp:23946 安卓设备安装并运行程序 IDA打开对应设备的so文件(arm, armv7, x86什么的)的Debugger -> Selecte Debugger -> Remote ARM Linux/Android Debugger -> OK, Debugger -> Process options -> HostName改成127.0.0.1,端口改成上面对应的 -> OK,Debugger -> Attach to process,从列表中选出对应的进程(没有root权限的机器好像显示不出来) 在对应代码行下断点,F9运行即可进行动态调试,右边的寄存器面板可以直接修改寄存器的值 其他一些需要注意的: init_array先于JNI_OnLoad会在so加载的时候就开始执行 导出表没有的函数有可能是在通过JNI_OnLoad动态注册的, 查找动态注册的方法是打开segment视图, .data.rel.ro.local段中放置的即为动态注册的函数(从上往下分别是函数名, 函数签名,

如何调试nRF5 SDK

匿名 (未验证) 提交于 2019-12-03 00:40:02
本文将讲述Nordic nRF5 SDK的主要调试手段,以帮助大家快速定位问题,并解决问题。 1. 通过打log方式进行调试 nRF5 SDK支持UART和SWD J-Link两种底层通信方式来打印日志,其中UART使用串口助手来查看日志,SWD J-Link使用J-Link RTT Viewer来查看打印日志。由于UART日志打印方式会占用一个UART口,而大部分nRF5芯片都只有一个UART口,从而导致资源冲突,为此 推荐大家使用 RTT 方式来打印日志 ,从而可以将UART口留给正常应用。J-Link RTT Viewer配置方式如下所示: RTT viewer日志打印窗口如下所示: 串口助手配置方式如下所示: Baud rate: 115.200 8 data bits 1 stop bit No parity HW flow control: None 随便选择一款你熟悉的串口助手,比如Putty或者ClearTerminal,ClearTerminal打印窗口如下所示: Putty打印窗口如下所示: 为了使能日志打印功能,每个版本的SDK配置稍有不同。 1.1 nRF5 SDK v11.0.0及以前版本 你需要到options for target->C/C++->define里面定义一个宏,如果定义“NRF_LOG_USES_UART=1”选择UART日志打印

ollydbg入门记录

匿名 (未验证) 提交于 2019-12-03 00:40:02
1.软件窗口说明 OllyDBG 中各个窗口的名称如下图。简单解释一下各个窗口的功能, 反汇编窗口:显示被调试程序的反汇编代码,标题栏上的地址、HEX 数据、反汇编、注释可以通过在窗口中右击出现的菜单 界面选项->隐藏标题 或 显示标题 来进行切换是否显示。用鼠标左键点击注释标签可以切换注释显示的方式。 寄存器窗口:显示当前所选线程的 CPU 寄存器内容。同样点击标签 寄存器 (FPU) 可以切换显示寄存器的方式。 信息窗口:显示反汇编窗口中选中的第一个命令的参数及一些跳转目标地址、字串等。 数据窗口:显示内存或文件的内容。右键菜单可用于切换显示方式。 堆栈窗口:显示当前线程的堆栈。 要调整上面各个窗口的大小的话,只需左键按住边框拖动,等调整好了,重新启动一下 OllyDBG 就可以生效了。 2.软件快捷键 F2 //下断点 F3 //加载一个可执行程序 F4 //程序执行到光标处 F5 //缩小,还原当前窗口 F7 //单步步入 F8 //单步步过 F9 //直接运行程序,遇到断点处,程序会暂停 Ctrl+F2 重新运行程序到起始处,用于重新调试程序 Ctrl+F9 //执行到函数的返回处,用于跳出函数 Alt+F9 //执行到用户代码处,用于快速跳出系统函数 Ctrl+G //输入十六进制地址,快速定位到该地址处 Ctrl+F2 //重新运行当前调试的程序 Alt+F2

Spark远程调试

匿名 (未验证) 提交于 2019-12-03 00:39:02
Spark远程调试 本例子介绍简单介绍spark一种远程调试方法,使用的IDE是IntelliJ IDEA。 1、了解jvm一些参数属性 -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8888 这里对上面的几个参数进行说明: -Xdebug 启用调试特性 -Xrunjdwp 启用JDWP实现,包含若干子选项: transport=dt_socket JPDA front-end和back-end之间的传输方法。dt_socket表示使用套接字传输。 address=8888 JVM在8888端口上监听请求,这个设定为一个不冲突的端口即可。 server=y y表示启动的JVM是被调试者。如果为n,则表示启动的JVM是调试器。 suspend=y y表示启动的JVM会暂停等待,直到调试器连接上才继续执行。suspend=n,则JVM不会暂停等待。 2、编译打包,正常打包即可。 3、配置IDEA调试的一些参数 4、在程序中设置断点 5、Run -> Debug 进行调试启动 6、Ok完成 文章来源: Spark远程调试

调试技术 -- 调试策略与原则

匿名 (未验证) 提交于 2019-12-03 00:33:02
看了部分软工视频,对软件调试技术有了些许的了解; 也对代码的调试有了自己的见解。 强行排错 是一种最常用的、效率较低的调试技术。它不需要过多的思考,直接打印出内存中 的内容,希望从中找出错误原因所在。在程序的特定部位设置打印语句,跟踪程序的执行,监视重要变量的变化;也可以利用某些程序语言的调试功能或专门的交互式调试工 具,通过设置断点等方法分析程序的动态过程。在采用这一技术时,必须有明确的目的, 尽量减少无关信息的输出,以提高设计效率。 回溯法 回溯是在小的程序中常用的一种有效的调试技术。具体做法是:分析错误表象,确定症状的位置,人工沿程序的控制流往回追踪源程序代码,直到找到错误原因为止。对于小程序, 回溯法可能把错误范围缩小到程序中的一小段代码,仔细分析这段代码不难确定出错的位置。不适合大的程序。 归纳法 归纳法是从个别现象推断出一般性结论的思维方法。采用归纳法调试程序的过程为: 首先把和错误有关的数据组织起来进行分析,以便发现可能的错误原因。然后导出对错误 原因的一个或多个假设,并利用已有的数据来证明或排除这些假设。如果已有的数据尚不 足以证明或排除这些假设,则需设计并执行一些新的测试用例,以获得更多数据。 演绎法 演绎法是从一般原理或前提出发,经过排除和细化的过程推导出结论。采用这种方法来调试程序时,首先设想出所有可能的出错原因,然后试图用测试来排除每一个假设的原因,