网站源代码如何在线进行调试?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网站源代码如何在线进行调试?相关的知识,希望对你有一定的参考价值。

想在网上直接调试样式请问如何调试?

开发调试环境: Ubuntu 14.10,openJdk 1.7,android Studio 1.0.2,android-5.0.1_r1源码
由于AS是基于IntelliJ IDEA开发的,所以本文也适用于IntelliJ IDEA
一、修改Android Studio(以下简称AS)的内存配置

因为在导入源码时需要消耗大量内存,所以先修改IDEA_HOME/bin/studio64.vmoptions(x86的机器修改studio.vmoptions)中-Xms和-Xmx的值。文档中使用的是748m, 可自行修改。
二、配置AS的JDK、SDK
在IDE中添加一个没有classpath的JDK, 这样可以确保使用源码里的库文件

并将其作为要使用的SDK的Java SDK。如下图

三、生成导入AS所需配置文件(*.ipr)
①编译源码(为了确保生成了.java文件,如R.java;如果编译过,则无需再次编译)
②检查out/host/linux-x86/framework/目录下是否有idegen.jar
如果idegen.jar不存在,执行:
mmm development/tools/idegen/

在5.0.1的源码中会生成res.java的文件夹,导致idegen.jar运行时抛FileNotFoundException,这是idegen的代码不够严谨造成的。
我的分享里有修改这个bug的patch,或者直接使用我分享的idegen.jar。
③执行
development/tools/idegen/idegen.sh

等待出现类似下面的结果:
Read excludes: 5ms
Traversed tree: 44078ms

这时会在源码的根目录下生成android.ipr和android.iml两个IntelliJ IDEA(AS是基于IntelliJ IDEA社区版开发的)的配置文件
Tips:
AS在导入代码时比较慢,建议先修改android.iml,将自己用不到的代码exclude出去.可以仿照过滤.repo文件夹的语法,如:
<excludeFolder url="file://$MODULE_DIR$/.repo" />
<excludeFolder url="file://$MODULE_DIR$/abi" />
<excludeFolder url="file://$MODULE_DIR$/art" />
这样在导入时就会跳过abi和art文件夹.过滤的越多,AS的处理速度就会越快.
④在AS中打开源码根目录下新生成的android.ipr

如果在导入时AS出现

则建议按照其给定的解决方法来解决(网址:http://confluence.jetbrains.com/display/IDEADEV/Inotify+Watches+Limit),具体内容如下图:

四、解决源码中跳转错误问题
①为当前工程设置正确的SDK和JDK

②设置'Modules'的依赖

先将所有依赖删掉,只留下上图'1'所指向的两个(注意:这里删除全部只是为了方便。如果确实用到了.jar,在将它们的路径添加进来就可以了.
如:5.0.1的ContactsCommon用到了geocoder-2.9.jar和libphonenumber-6.2.jar)
点击上图中'2'指向的'+'并选择上图'3'指向的'Jars or directories'选项,依次将frameworks和external文件夹添加进来.如:

其它版本的代码在添加frameworks时可能会显示成:

没有关系,只是显示问题,点击OK还是会把frameworks路径添加进去的.
如果还有代码跳转错误,请仿照上面的步骤将相应代码的路径或jar文件添加到其Dependencies标签页中即可.
五、DEBUG源码
我们可以通过给刚导入的工程在'Modules'中添加'Android Framework'来让AS将它作为一个Android工程,从而方便我们调试代码.

可以按照上图中'1'和'2'来添加Android Framework支持.

在代码中加断点,然后选择'Run'->'Attach debugger to Android process'或者直接点击下图所示的图标
在弹出的选择进程(Choose Process)对话框中,勾选显示所有进程,选择要DEBUG的代码所在的进程,点击OK即可.
六、其它
代码中很多地方提示Call requires API Level x.... 出现这个问题是因为AS将我们的工程当做安卓应用程序工程了,且源码中没有指定minSdkVersion.
我们只需在源码根目录加一个声明minSdkVersion的AndroidManifest.xml文件即可(分享了一个AndroidManifest.xml)。
也可以考虑使用build.gradle来解决该问题。
参考技术A 第一步,调试的准备。
用C#语言编写一个测试dll文件的程序,由于dll源程序是c的,且运行结果是黑屏的,所以C#代码也是运行在黑屏的console环境下。完整代码如下。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace TestMelpclass Program[DllImport(@D:\Visual Studio Projects\FileMelp\Debug\FileMelp.dll, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
extern static void cmd_melp(int argc, string[] argv);
static void Main(string[] args)//string cmd = melp -s -i D:/bin/bit -o D:/bin/output;
string cmd = melp -a -i D:/bin/inputD -o D:/bin/bitRight;
string[] argv = cmd.Split(new char[] ' ' );
int argc = argv.Length;
cmd_melp(argc, argv);由于调试的FileMelp.dll文件和本程序不在同一个文件夹下,容易出现文件地址问题,所以本测试程序的文件均采用绝对地址。另外cmd的格式要求不能有两个连续的空格,也可以通过使用Trim函数,解决这个问题。
第二步,定位到自己改写的带有源代码的dll工程。
本文的FileMelp.dll工程,是通过本空间的生成VS dll那篇博客生成的,具体实现方法不在赘述。下面的两段代码分别添加到FileMelp工程melp.h和melp.c文件最下面。
#ifndef LIB_H
#define LIB_H
extern _declspec(dllexport) void cmd_melp(int argc, char **argv);
/* 加入任意你想加入的函数定义*/#endifvoid cmd_melp(int argc, char **argv)main(argc,argv);按F6,上述步骤实现FileMelp.dll动态库的生成。
第三步,添加测试程序到dll源代码处。
在FileMelp工程里面,右击FileMelp工程,选择属性。
或者按Alt+Enter,弹出如下界面。
在Configuration Properties\Debugging\Command选择第一步生成的测试.exe文件。这样完成了调试前的准备。接下来,在需要调试的代码地方,添加断点。本回答被提问者采纳

紫光同创PGL22G学习四以24LC04为例,上手I2C接口使用(附加学习Opencores开源网站使用 和 Fabric Debugger在线调试)

导读:本实验通过使用开源软件 opencores 上的 I2C master 控制器去控制 I2C 接口的 EEPROM 读写,练习如何有效的使用开源代码提升开发效率。同时,附带学习基于 Fabric Debugger 在线调试方法。

文章目录

一、实验原理

1.1、硬件电路

PGL22G 开发板板载了一片 EEPROM,型号为 24LC04,容量为:4Kbit(2*256*8bit),由 2 个 256byte 的 block 组成,通过 IIC 总线进行通信。板载 EEPROM 是为了学习 IIC 总线的通信方式,EEPROM 的 I2C 信号与FPGA 的 IO 口连接示意图如下所示:

从上图可以看到,FPGA 芯片通过 I2C 总线连接 EEPROM 24LC04,I2C 的两根总线各上拉一个 4.7K的电阻到 3.3V,所以当总线上没有输出时会被拉高。24LC04 模块外围电路如下图所示:

从上图可以看出,24LC04 的写保护引脚(WP)没有使能,不然 FPGA 会无法写入数据。另外,24LC04 的三根地址线A0~A2在电路上都为低,所以 24LC04 的设备地址为 0xA0。还有特别重要的的一点,24LC04的单页为16个字节!

1.2、I2C的总线协议和时序

I2C 标准模式速率100kbit/s快速模式速率 400kbit/s,支持多机通讯, 支持多主控模块,但同一时刻只允许有一个主控。由数据线 SDA 和时钟 SCL 构成串行总线,每个电路和模块都有唯一的地址

I2C 设备的操作可分为写单个存储字节写多个存储字节读单个存储字节读多个存储字节,各个操作如下图所示:

下面对 I2C 总线通信过程中出现的几种信号状态和时序进行分析。

  • 1、总线空闲状态

I2C 总线总线的 SDA 和 SCL 两条信号线同时处于高电平时,规定为总线的空闲状态。此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。

  • 2、启动信号(Start)

在时钟线 SCL 保持高电平期间,数据线 SDA 上的电平被拉低(即负跳变),定义为 I2C 总线总线的启动信号,它标志着一次数据传输的开始。启动信号是由主控器主动建立的,在建立该信号之前 I2C 总线必须处于空闲状态,如下图所示。

  • 3、停止信号(Stop)

在时钟线 SCL 保持高电平期间,数据线 SDA 被释放,使得 SDA 返回高电平(即正跳变),称为 I2C 总线的停止信号,它标志着一次数据传输的终止。停止信号也是由主控器主动建立的,建立该信号之后,I2C 总线将返回空闲状态。

  • 4、数据位传送

在 I2C 总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制),即在 SCL 串行时钟的配合下,在 SDA 上逐位地串行传送每一位数据。进行数据传送时,在 SCL 呈现高电平期间,SDA 上的电平必须保持稳定,低电平为数据 0,高电平为数据 1。只有在 SCL 为低电平期间,才允许 SDA 上的电平改变状态。

  • 5、应答信号(ACK 和 NACK)

I2C 总线上的所有数据都是以 8 位字节传送的,发送器每发送一个字节,就在第9个时钟脉冲期间释放数据线,由接收器反馈一个应答信号。应答信号为低电平时,规定为有效应答位(ACK 简称应答位),表示接收器已经成功地接收了该字节;应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。对于反馈有效应答位 ACK 的要求是,接收器在第 9 个时钟脉冲之前的低电平期间将 SDA 线拉低,并且确保在该时钟的高电平期间为稳定的低电平。如果接收器是主控器,则在它收到最后一个字节后,发送一个 NACK 信号,以通知被控发送器结束数据发送,并释放 SDA 线,以便主控接收器发送一个停止信号。

二、程序设计

2.1、I2C控制器源码获取

I2C 时序虽然简单,但是写的不好也会出现很多问题,在开源网站 http://opencores.org/ 上我们可以找到很多非常好的代码,这些代码大部分都提供详细的文档和仿真。俗话说,他山之石,可以攻玉,恰当的使用开源代码,不光能提升我们的开发效率,也能学习别人的开发思路。由于代码大部分都是经过很长时间反复修改,反复精炼后的,所以有些代码理解起来可能比较困难,在不能很好的理解别人代码的时候,最好的办法就是仿真

如何下载开源的i2c控制器代码呢?且听娓娓道来。

:下载前需要先注册账号!

  • 1、进入 opencores 后,点击左侧的 PROJECTS,如下图所示:

  • 2、打开其中的Communication controller,如下所示:

  • 3、找到I2C controller core,并点击进入选择download,进行下载,如下图所示:

2.2、读写EEPROM程序设计

从 IP core 文档得知,i2c_master_byte_ctrl 模块主要完成一个字节的读写,我们只需要按照 I2C 读写的要求,完成设备地址、寄存器地址、数据等读写即可。

i2c_master_top 模块是我们对 i2c_master_byte_ctrl 模块的再次封装,完成一个寄存器的读写,由于不同的设备寄存器可能是 8bit,也可能是 16bit,这里 i2c_addr_2byte 信号来控制寄存器地址是 8 位还是 16 位。对于i2c_master_top 模块状态机来说,读写寄存器操作流程如下:

  • 如果是写操作:先写一个字节设备地址(写操作),再写 1 个字节或 2 个字节的寄存器地址,再写一个字节的数据;
  • 如果是读操作:先写一个字节的设备地址(写操作),再写 1 个字节或 2 字节的寄存器地址,完成地址的写入,再次写设备地址(读操作),然后读取一个字节的数据。

不管怎么说,程序设计都是要满足芯片时序要求的,所以在阅读程序之前最好先把芯片的数据手册仔细阅读一遍。

i2c_master_top 状态机的状态转换图如下图所示:

i2c_master_top 模块端口列表如下:

信号名称方向说明
clkin时钟输入
rstin异步复位输入,高复位
---
clk_div_cntinI2C 时钟分频因子,等于系统时钟频率/(5 * I2C 时钟频率) - 1。例如 50Mhz 系统时钟,100Khz 的I2C,配置为 99,400Khz 的 I2C,配置为 24
---
scl_pad_iinI2C 时钟数据输入,本实验可忽略
scl_pad_ooutI2C 时钟输出
scl_padoen_ooutI2C 时钟输出使能,低有效,I2C 外部有上拉电阻,如果输出高阻态,则会被拉到高电平,在本实验中,高电平输出时输出高阻
---
sda_pad_iinI2C 数据输入
sda_pad_ooutI2C 数据输出
sda_padoen_ooutI2C 数据输出使能,低有效。在本实验中,高电平输出时输出高阻。
---
i2c_addr_2bytein寄存器地址是 8 位还是 16 位,1表示 16 位,0表示 8 位
---
i2c_read_reqinI2C 寄存器读请求
i2c_read_req_ackoutI2C 寄存器读请求应答
---
i2c_write_reqinI2C 寄存器写请求
i2c_write_req_ackoutI2C 寄存器写请求应答
---
i2c_slave_dev_addrinI2C 设备地址,8bit,最低位忽略,有效数据位是高 7位。
i2c_slave_reg_addrin寄存器地址,8 位地址时,低 8 位有效
---
i2c_write_datain写寄存器数据
i2c_read_dataout读寄存器数据
---
errorout设备无应答错误

i2c_eeprom_test 模块完成 EEPROM 的读写,EEPROM 设备地址A0,程序中将地址 00 的数据读出,然后通过 LED 显示,在 KEY2 按下时,数字加一并再次写入 EEPROM 并显示出来。在 I2C控制器中,代码的大部分功能在备注中也有很多批注。

三、下载实验

下载实验程序后,可以看到 LED 显示一个二进制数字,这个数字是存储在 EEPROM 中 00 地址的数据,数据是随机的,这个时候按键 KEY2 按下,数字加一,并写入了 EEPROM,再次下载程序,可以看到直接显示更新后的数据。

四、使用在线调试 Fabric Debugger观察信号

使用 Fabric Debugger 可以非常直观的看到程序在开发板上运行时各个信号的变化,在本例程中添加一个 Debug Core 来观察程序运行时各数据线的变化情况。具体操作步骤如下:

  • 1、打开PDS软件,选择工具栏的“Inserter”,如下图所示:

  • 2、在弹出界面选择 New DebugCore Unit 来新建一个 Debug Core,如下图所示:


  • 3、单击 U0:DebugCore,会跳到参数设置界面,在"Trigger Parameters"栏中根据需求选择采样深度Sample Depth。这里全部保持默认,如下图所示:

  • 4、在"Net Connections"栏中选择 Modify Connections,进行 Net 修改;

  • 5、弹出的界面中,首先在 TriggerPort 栏中进行观测信号关联。本例中,选择左侧 read_data,然后单击Make Connections,可以在 TriggerPort 栏中看到关联的观测信号 read_data,如下图所示:

:read_data有七路信号,所以占了7位。

  • 6、以同样的方式对 Clock 栏中时钟信号关联,选择左侧 nt_sys_clk,然后单击 Make Connections,可以在 Clock 栏中看到关联的观测信号 nt_sys_clk,然后单击 OK,如下图所示:

  • 7、回到如下界面,直接关闭即可,如下图所示:

  • 8、接下来重新生成.sbit 文件。右击 Generate Bitstream,选择Rerun All,在弹出的窗口选择Yes后,等待全编译完成,会生成带有在线调试DebugCore的比特流文件,如下图所示:


  • 9、上面的工作准备好后,接下来才是正式开始调试, 单击 Debugger确保开发板上电并连接了下载器),如下图所示:

  • 10、单击 JTAG 扫描按钮,在找到后单击 OK,如下图所示:



  • 11、右击 DEV:0MyDevice0,在下拉菜单中单击 Configure Bitstream File,如下图所示:

  • 12、在弹出窗口,选择刚刚编译生成的比特流文件,点击Open,最后点击OK,如下图所示:

  • 13、到此,程序已下载到 FPGA 中可以在线观察所需要的信号,选择 Waveform,选择触发模式为连续,并单击 run,如下图所示:

  • 14、可以看到 read_data 数据,每按一次 KEY2 键运行一次可以看到数据增加 1

参考

以上是关于网站源代码如何在线进行调试?的主要内容,如果未能解决你的问题,请参考以下文章

常用网站记录

推荐14个牛逼的代码编辑网站

推荐14个牛逼的代码编辑网站

做网站-Chrome如何调试JS代码

如何理解和分析网站源代码

紫光同创PGL22G学习四以24LC04为例,上手I2C接口使用(附加学习Opencores开源网站使用 和 Fabric Debugger在线调试)