前面已经支持了几种不同的方式添加断点,但是必须事先在代码中添加断点,在使用上不是那么灵活方便.本文将支持动态增删断点,只需要开一开始引入调试库即可,后续可以在调试过程中动态的添加和删除断点.事不宜迟,我们直接进入正题. 源码已经上传Github,欢迎watch/star. 本博客已迁移至CatBro's Blog,那是我自己搭建的个人博客,欢迎关注.本文链接 实现分析 入口断点 尽管我们目标是支持动态添加断点,但还是需要一个入口,提供用户添加初始的断点.仍然像之前一样,在用户代码中显式添加的确可…
说到Lua代码调试,最常用的方法应该就是加一堆print进行打印.print大法虽好,但其缺点也是显而易见的.比如效率低下,需要修改原有函数内部代码,在每个需要的地方添加print语句,运行一次只能获取一次信息,下次换个地方又得重新添加print语句.而且有时候,事先并不知道该去哪打印.或者打印什么内容,需要通过运行中获取的信息才能确定. 当print大法无法满足我们的需求时,就需要类似断点调试这样更高级的调试功能.本文将从零开始编写一个Lua调试器,实现类似gdb的断点调试功能. 本文代码已开…
在前一篇01最小实现中,我们实现了Lua断点调试的的一个最小实现.我们编写了一个模块,提供了两个基本的接口:设置断点和删除断点. 虽然我们已经支持在断点进行变量的打印,但是需要自己指定层数以及变量索引,使用起来不是很方便.要进行upvalue打印的话,操作会更加麻烦.为了提升调试的方便性,我们决定封装一个通用的变量打印函数,可以通过变量名查找到对应变量的值进行打印.支持局部变量.upvalue以及全局的_ENV中的变量. 本文代码已开源至Github,欢迎watch/star. 本博客已迁移至C…
在前面两篇01最小实现及02通用变量打印中,我们已经实现了设置断点.删除断点及通用变量打印接口. 本篇将继续新增两个辅助的调试接口:调用栈回溯打印接口.通用变量设置接口.前者打印调用栈的回溯信息,后者可以方便地修改变量的值,支持局部变量.upvalue以及全局的_ENV中的变量. 本文代码已开源至Github,欢迎watch/star. 本博客已迁移至CatBro's Blog,那里是我自己搭建的个人博客,欢迎关注. 调用栈打印函数 我们首先来实现调用栈回溯打印接口printtraceback(…
我们之前已经支持了通过函数来添加断点,并且已经支持了行号的检查和自动修正.但是通过函数来添加断点有一些限制,如果在当前的位置无法访问目标函数,那我们就无法对其添加断点. 于是,本篇我们将扩展断点设置的接口,支持通过函数名称添加断点,以突破这个限制. 源码已经上传Github,欢迎watch/star. 本博客已迁移至CatBro's Blog,那是我自己搭建的个人博客,欢迎关注.本文链接 实现分析 由于Lua是动态类型语言,变量可以是任何值.而函数在Lua语言中又是第一类值,与其他值一样使用,可…
在前一篇中我们支持了通过函数名称来添加断点,我们同时也提到了在Lua中一个函数的名称的并不是确定的.准确的说,Lua中的函数并没有名称,所谓名称其实是保存这个函数值的变量的名称. 于是通过函数名称添加断点就造成了一定的不确定性,因为函数被调用时并不一定是以这个名字被调用的.另外,多个不同的函数也可能以相同的名字进行调用. 所以为了解决这个问题,本篇我们将继续扩展断点的设置接口,支持通过包名来添加断点.因为包名相对更具确定性,配合行号可以进行精确定位. 源码已经上传Github,欢迎watch/s…
在第一篇的01最小实现中,我们实现了一个断点调试的最小实现,在设置钩子函数时只加了line事件,显然这会对性能有很大的影响.而后来两篇02通用变量打印和03通用变量修改及调用栈回溯则是提供了一些辅助的调试接口,并没有对钩子函数进行修改. 我们本篇将在钩子中引入call和return事件的处理,尝试对性能进行优化. 源码已经上传Github,欢迎watch/star. 本博客已迁移至CatBro's Blog,那里是我自己搭建的个人博客,欢迎关注. 实现分析 当前的实现因为只加了line事件,执行…
在上一篇04优化钩子事件处理中,我们在钩子函数中引入了call和return事件的处理,对性能进行了优化. 细心的同学可能已经发现了,我们的hook函数中call事件和line都需要对整个断点表进行遍历,这其中其实是存在着一些冗余的.因为call事件只关心函数是否有断点,而line事件则只关心本函数内有哪些断点.所以我们可以想办法优化一下断点信息的数据结构,进一步提升性能. 源码已经上传Github,欢迎watch/star. 本博客已迁移至CatBro's Blog,那里是我自己搭建的个人博客…
前面两篇我们对性能做了一个优化,接下来继续来丰富调试器的特性. 我们前面提到过,函数内并不是所有行都是有效行,空行和注释行就不是有效行.我们之前在添加断点的时候,并没有对行号进行检查,任何行号都能成功添加断点.所以如果添加的断点行号是无效的,那么永远也不会断到那里.但是钩子里并不知道它是无效的,call事件仍然会以为函数有断点从而启动line事件,造成CPU的浪费. 所以本篇,我们将对断点的行号进行检查,对于不在函数范围内的行号直接添加断点失败:在函数范围内的行号则自动修正为下一个有效的行号:另…
<?xml version="1.0" encoding="utf-8"?> <!--Flex中如何使用addChild()和removeChild()函数动态添加或删除Accordion容器中项目的例子 --> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark…
(以后,参考链接和作者将在文章首部给出,转载请保留此部分内容) 参考链接:http://www.narkii.com/club/thread-299977-1.html,作者:纳金网 比巴卜: 参考链接:http://game.ceeger.com/forum/read.php?tid=2852,作者:Unity圣典论坛 kuku小夭 动态添加和删除Sprite可以在很多地方用到,这里以实现显示技能CD时间来为例,CD的时间是以sprite来显示的,当然CD时间以文本显示更为合理,这里只是作为例…
查看本章节 查看作业目录 需求说明: 在页面上绘制一张表格,使用 DOM 节点的动态添加和删除向表格中插入数据,点击表格每行后的"删除"超链接,使用 DOM 节点的删除操作将对应的行数据删除 在文本输入框中输入姓名.年龄.班级和手机号,并选择性别 点击"插入数据"按钮,将输入框中的数据插入到表格中,表格中的数据将增加一条 点击表格中每条数据后的"删除"超链接,将删除该条数据,表格中的数据将减少一条 实现思路: 在页面中绘制表格,并添加 4 条虚拟…
为了解决彻底删除fragment,我们要做的是:1.将FragmentPagerAdapter 替换成FragmentStatePagerAdapter,因为前者只要加载过,fragment中的视图就一直在内存中,在这个过程中无论你怎么刷新,清除都是无用的,直至程序退出: 后者 可以满足我们的需求.2.我们可以重写Adapter的方法--getItemPosition(),让其返回PagerAdapter.POSITION_NONE即可: @Override public int getItem…
项目使用ulua,我神烦这个东西.lua单纯在lua环境使用还好,一旦要跟外界交互,各种月经不调就来了.要记住贼多的细节,你才能稍微处理好.一个破栈,pop来push去,位置一会在-1,一会在-3,21世纪已经过去五分之一了好吗,谁乐意像汇编一样操作?那十几个操作函数,愣是比正则表达式规则还难记,用完就忘.我发现lua心智负担完全跟简洁搭不上边,贼他娘重,实现个面向对象都乱七八糟.我学c++都没觉得有什么不爽的,就lua代码各种不乐意看,各种小tips在那里,什么meta,weak,_G,逼着你…
这是道哥的第008篇原创 一.前言 上篇文章我们聊了gdb的底层调试机制,明白了gdb是利用操作系统提供的系统信号来调试目标程序的.很多朋友私下留言了,看到能帮助到大家,我心里还是很开心的,其实这也是我继续输出文章的最大动力!后面我会继续把自己在项目开发中的实战经验进行总结. 由于gdb的代码相对复杂,没有办法从代码层面仔细的分析调试细节,所以这次我们选择一个小巧.开源的Lua脚本语言,深入到最底层的代码中去探究一下代码调试真正是怎么一回事. 不过请放心,虽然深入到代码最底层,但是理解难度并不大…
虽然网上已经有多的数不清的调试教程了,但仍然没有发现哪篇文章写的通俗易懂,索性自己尝试写写自己的一些使用习惯或者说是心得,希望对那些还不是很懂得使用断点调试的孩子有一些帮助(大神请无视~). 1.断点调试是啥?难不难? 断点调试其实并不是多么复杂的一件事,简单的理解无外呼就是打开浏览器,打开sources找到js文件,在行号上点一下罢了.操作起来似乎很简单,其实很多人纠结的是,是在哪里打断点?(我们先看一个断点截图,以chrome浏览器的断点为例) 步骤记住没? 用chrome浏览器打开页面 →…
好了开始写一个简单的调试程序,我们先来一个for循环 ? 1 2 3 4 5 6 7 8 <code class="language-java hljs ">for (int i = 0; i < 10; i++) { //获取当前i的值     int selector = i;     //打log查看当前i的值(此步多余,实际开发请忽略)     Logger.e("for当前的i的值:" + i);     //调用方法     stepN…
转自:http://www.2cto.com/kf/201506/408358.html 有人说Android 的调试是最坑的,那我只能说是你不会用而已,我可以说Android Studio的调试是我见过最棒的. 好了开始写一个简单的调试程序,我们先来一个for循环 1 2 3 4 5 6 7 8 <code class="language-java hljs ">for (int i = 0; i < 10; i++) { //获取当前i的值     int sel…
我的安装环境:XAMPP版本号V3.1.0 ;phpStorm版本8.0.3;windowsxp 32bit.您老人家先过目一下,不然怕影响意义. XAMPP.phpStorm 都直接安装在了D盘根目录,9999m目录建在D:\xampp\htocts下,即目录工程文件夹路径为D:\xampp\htocts\9999m.在phpStorm>File>open,找到9999m,点击确定,加载9999m到了phpStorm(安装环境路径根据需要自行更改,后面的配置内容也类似).图1 XAMPP+p…
1.断点调试是啥?难不难? 断点调试其实并不是多么复杂的一件事,简单的理解无外呼就是打开浏览器,打开sources找到js文件,在行号上点一下罢了.操作起来似乎很简单,其实很多人纠结的是,是在哪里打断点?(我们先看一个断点截图,以chrome浏览器的断点为例) 步骤记住没? 用chrome浏览器打开页面 → 按f12打开开发者工具 → 打开Sources → 打开你要调试的js代码文件 → 在行号上单击一下,OK!恭喜你的处女断点打上了,哈哈~~ 火狐浏览器: 2.断点怎么打才合适? 打断点操作…
1.断点调试是啥?难不难? 断点调试其实并不是多么复杂的一件事,简单的理解无外呼就是打开浏览器,打开sources找到js文件,在行号上点一下罢了.操作起来似乎很简单,其实很多人纠结的是,是在哪里打断点?(我们先看一个断点截图,以chrome浏览器的断点为例) 步骤记住没? 用chrome浏览器打开页面 → 按f12打开开发者工具 → 打开Sources → 打开你要调试的js代码文件 → 在行号上单击一下,OK!恭喜你的处女断点打上了,哈哈~~ 2.断点怎么打才合适? 打断点操作很简单,核心的…
1.断点调试是啥?难不难? 断点调试其实并不是多么复杂的一件事,简单的理解无外呼就是打开浏览器,打开sources找到js文件,在行号上点一下罢了.操作起来似乎很简单,其实很多人纠结的是,是在哪里打断点?(我们先看一个断点截图,以chrome浏览器的断点为例) 步骤记住没? 用chrome浏览器打开页面 → 按f12打开开发者工具 → 打开Sources → 打开你要调试的js代码文件 → 在行号上单击一下,OK!恭喜你的处女断点打上了,哈哈~~ 2.断点怎么打才合适? 打断点操作很简单,核心的…
开篇:在本笔记系列的第一篇中,我们介绍了如何搭建伪分布与分布模式的Hadoop集群.现在,我们来了解一下在一个Hadoop分布式集群中,如何动态(不关机且正在运行的情况下)地添加一个Hadoop节点与下架一个Hadoop节点. 一.实验环境结构 本次试验,我们构建的集群是一个主节点,三个从节点的结构,其中三个从节点的性能配置各不相同,这里我们主要在虚拟机中的内存设置这三个从节点分别为:512MB.512MB与256MB.首先,我们暂时只设置两个从节点,另外一个作为动态添加节点的时候使用.主节点与…
Lua+Redis 断点调试环境搭建 windows环境,使用Redis,写lua脚本头疼的问题之一不能对脚本断点调试,google加上自己的摸索,终于搞定. 1.下载ZeroBraneStudio,我下载的是破解版(我自己为自己感到可耻,其实并不贵,百十来块钱的样子) 解压后在bin下有lua解释器的路径,把该路径添加到环境变量中:假设解释器路径是:D:/ZeroBraneStudio/bin/lua.exe,那么就把D:/ZeroBraneStudio/bin添加到Path环境变量下. 2.…
到目前为止我们的调试手段只有一种: 根据程序执行时的出错现象假设错误原因,然后在代码中适当的位置插入printf,执行程序并分析打印结果,如果结果和预期的一样,就基本上证明了自己假设的错误原因,就可以动手修正Bug了. 如果结果和预期的不一样,就根据结果做进一步的假设和分析. 这里,我们介绍一种很强大的调试工具gdb,可以完全操控程序的运行,使得程序就像你手里的玩具一样,叫它走就走,叫它停就停,并且随时可以查看程序中所有的内部状态,比如各变量的值.传给函数的参数.当前执行的代码行等. 有了gdb…
之前说过断点调试,但是针对的是单文件的断点调试.在实际应用中,一个项目是多目录多文件的 参考资料:gdb debugger 目录结构: $ tree .├── gdbSomeFiles.cpp├── Libs│   ├── add.cpp│   ├── add.h│   └── makefile└── makefile add.h #pragma once class CAdd { public: CAdd(void); int add(int &a, int &b); virtual ~…
ok,前面准备给一个dll写wrapper,写了篇日志,看似写的比较明白了,但是其实有很多米有弄明白的.比如PIL中使用的element,key,tname,field这些,还是比较容易混淆的.今天正好搞搞清楚. 1.stack 这个应该不用多讲了,C和lua中的交互就是基于一个stack的,而且每次lua调用一个c函数,都是给分配一个新的stack.它的原型: typedef int (*lua_CFunction) (lua_State *L); stack中的基本单元在PIL中多成为ele…
lua中的协程和线程类似: 1. 协程拥有自己的独立的栈,局部变量,和指令: 2. 所有协程都可以共享全局变量: 3. 协程不能像线程那样并行执行,协程之间需要相互协调执行,同一个时刻只能运行一个协程: 如何使用协程: coroutine.create:创建一个协程,返回一个协程句柄: coroutine.status:查看一个协程的状态,suspended,running,dead,normal: coroutine.resume:恢复一个协程的执行,如果正常就返回true,错误返回false…
如果你看了LUA的文档,那么就应该很清楚LUA与C交互数据时都是用到LUA中所谓的stack.那么当我调用lua_open函数之后栈是什么样的呢?空的(luaopen_base等会往栈上加进一些东西).那么至于如何操作栈上的数据,我想官方文档上已经说得很清楚了,不过最初我对于栈的顺序有一些迷糊,所以就说说这个.现在假如我有如下的一段代码: 代码: lua_State* L = lua_open();lua_pushnumber( L, 211 );lua_pushnumber( L, 2222…
lua中的require机制    为了方便代码管理,通常会把lua代码分成不同的模块,然后在通过require函数把它们加载进来.现在看看lua的require的处理流程.1.require机制相关的数据和函数    package.path:保存加载外部模块(lua中"模块"和"文件"这两个概念的分界比较含糊,因为这个值在不同的时刻会扮演不同的角色)的搜索 路径,这种路径是"模板式的路径",它里面会包含可替代符号"?",这…