程序调试

Spring-boot的debug调试

流过昼夜 提交于 2019-12-06 10:44:51
xml文件中配置: 1 <property> 2 <name>scf.server.vm.all</name> 3 <value>-Xms512m -Xmx512m -Xmn128m -Xss1024K -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -XX:ParallelGCThreads=20 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=4 -XX:CMSInitiatingOccupancyFraction=70 -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -XX:+PrintGCApplicationStoppedTime -Xloggc:../log/orgagent/gc.log -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=7983 -Dspring.profiles.active=dev</value> 4 </property> 其中-Xdebug

科学使用Log4View2

放肆的年华 提交于 2019-12-06 10:14:00
目录 目录 前言 科学使用 编辑和调试程序集 调试程序集 编辑程序集 结语 推荐文献 目录 NLog日志框架使用探究-1 NLog日志框架使用探究-2 科学使用Log4View2 前言 这个标题很低调吧,但是既然你点进来,那么接下来的干货是属于你的。 不想成为黑客的程序员不是好程序员。在上一篇 《NLog日志框架使用探究-2》 文章提到了Log4View2工具有30天的试用期,超过试用期许多功能就被限制,比如不能使用数据库加载。那么我们如何科学使用它呢? 本篇文章涉及到反编译技术、对称加密技术、IL中间语言等技术。掌握了这些技术之后你会发现原来自己也能更加科学的使用软件。 接下来的内容仅供个人学习使用,任何人不得用于商业用途或用于非法途径,一切后果本人概不负责。 科学使用 我们可以使用 dnspy 、 ilspy 以及reflector对.net程序进行反编译。Log4View2就是纯.net开发的项目。 reflector是收费的,也需要科学使用。 ILSpy是开源的.NET程序集浏览器和编译器。 dnSpy是一个调试器和.NET程序集编辑器。即使没有任何可用的源代码,也可以使用它来编辑和调试程序集。 dnspy也是基于ILSpy的反编译引擎,在它基础上增加了丰富的功能,甚至可以直接修改源代码。首先我们通过dyspy看看相关注册的源码,直接在安装路径找到Log4View

Android-x86 调试程序拾遗

倾然丶 夕夏残阳落幕 提交于 2019-12-06 09:42:00
针对文章 用Android-X86和VirtualBox打造高性能Android开发环境 ( http://be-evil.org/create-an-x86-emulator-based-height-performance-android-develop-environment.html ) 中一些注意事项进行补充. 主要是如何让它启动就竖屏,不用每次都修改配置文件 一 先把AndroidX86装到硬盘上 然后进行下面设置 1、完全关闭VirtualBox,必须完全关闭,否者修改的参数会还原。 2、修改虚拟机的.Vbox文件 在<ExtraData>小节中加入 <ExtraDataItem name="CustomVideoMode1" value="480x800x16"/> <ExtraDataItem name="CustomVideoMode2" value="320x480x16"/> 注:这两种是标准的Android显示模式 二 修改Android启动参数 1.进入Android后,按alt+F1进入命令行模式,执行 mkdir /data/fs mount -t ext3 /dev/block/sda1 /data/fs vi /data/fs/grub/menu.lst title Android-x86 2.2 (MDPI 480x800) kernel

Java调试平台体系JPDA

大憨熊 提交于 2019-12-06 09:36:35
Java 平台调试体系(Java Platform Debugger Architecture,JPDA)定义了一个完整独立的体系,它由三个相对独立的层次共同组成,而且规定了它们三者之间的交互方式,或者说定义了它们通信的接口。这三个层次由低到高分别是 Java 虚拟机工具接口(JVMTI),Java 调试线协议(JDWP)以及 Java 调试接口(JDI)。 JVMTI(Java Virtual Machine Tool Interface)即指 Java 虚拟机工具接口, 定义了JVM为了支持调试而必须提供的功能及相应的访问接口。这些访问接口是以本地语言的形式提供的,由JVM(比如Sun公司的HotSpot VM)负责实现。 它是一套由虚拟机直接提供的 native 接口,它处于整个 JPDA 体系的最底层,所有调试功能本质上都需要通过 JVMTI 来提供。 JDWP(Java Debug Wire Protocol)是一个为 Java 调试而设计的一个通讯交互协议,它定义了调试器和被调试程序之间传递的信息的格式。在 JPDA 体系中,作为前端(front-end)的调试者(debugger)进程和后端(back-end)的被调试程序(debuggee)进程之间的交互数据的格式就是由 JDWP 来描述的,它详细完整地定义了请求命令、回应数据和错误代码,保证了前端和后端的

Release和Debug有什么不同

穿精又带淫゛_ 提交于 2019-12-06 07:05:02
Release版称为发行版,Debug版称为调试版。 Debug中可以单步执行、跟踪等功能,但生成的可执行文件比较大,代码运行速度较慢。Release版运行速度较快,可执行文件较小,但在其编译条件下无法执行调试功能。 Release的exe文件链接的是标准的MFC DLL(Use MFC in a shared or static dll)。这些DLL在安装Windows的时候,已经配置,所以这些程序能够在没有安装Visual C++ 6.0的机器上运行。而Debug版本的exe链接了调试版本的MFC DLL文件,在没有安装Visual C++6.0的机器上不能运行,因为缺相应的DLL,除非选择use static dll when link。 来源: oschina 链接: https://my.oschina.net/u/67036/blog/6042

哈工大操作系统实验课调试入门

百般思念 提交于 2019-12-06 05:20:30
“Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it?” ― Brian Kernighan 用户态调试: 下面的代码模拟了一个简化的密码认证过程,程序从标准输入读入长度为10的令牌,逐位与1异或后和存储的密码比较,如果和10位密码匹配则输出“Password OK”。你能发现其中的 Bug 吗👀 (不考虑运行环境的安全性) /* auth.c */ #include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <string.h> #define PW_LEN 10 int main(int argc, const char *argv[]){ int fd; unsigned int i; char pw_buf[PW_LEN+1] = {'\0'}; char pw_buf2[PW_LEN+1] = {'\0'}; if(fd=open("./password",O_RDONLY,0400) < 0) return 1;

用Helm3构建多层微服务

只愿长相守 提交于 2019-12-06 04:16:33
摘自: https://www.cnblogs.com/code-craftsman/p/11958281.html 用Helm3构建多层微服务 Helm是一款非常流行的k8s包管理工具。以前就一直想用它,但看到它产生的文件比k8s要复杂许多,就一直犹豫,不知道它的好处能不能抵消掉它的复杂度。但如果不用,而是用Kubectl来进行调式真的很麻烦。正好最近Helm3正式版出来了,比原来的Helm2简单了不少,就决定还是试用一下。结果证明确实很复杂,它的好处和坏处大致相当。有了它确实能大大简化对k8s的调式,但也需要花费比较多的时间来学习,而且产生的配置文件要复杂许多。但是事实是现在没有什么很方便的帮助调式k8s的工具,在没有更好的方案之前,我还是建议用它,只是前期需要花些功夫学习和掌握它。 Helm3和Helm2的语法差不太多,只是使用起来更方便,不用安装Tiller。一个比较明显的变化是不再需要“requirements.yaml”, 依赖关系是直接在“chart.yaml”中定义。有关Helm3和Helm2的区别,详情请参见 CHANGES SINCE HELM 2 。 网上有不少讲述Helm的文章,但大部分都是主要讲解安装和举一个简单的例子。但Helm使用起来还是比较复杂的,一定要有一个复杂的例子才能把它的功能讲清楚,里面有不少设计方面的问题需要思考

【转】Linux gdb调试器用法全面解析

天大地大妈咪最大 提交于 2019-12-06 04:13:46
GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,GDB主要可帮助工程师完成下面4个方面的功能: 启动程序,可以按照工程师自定义的要求随心所欲的运行程序。 让被调试的程序在工程师指定的断点处停住,断点可以是条件表达式。 当程序被停住时,可以检查此时程序中所发生的事,并追索上文。 动态地改变程序的执行环境。 不管是调试Linux内核空间的驱动还是调试用户空间的应用程序,掌握gdb的用法都是必须。而且,调试内核和调试应用程序时使用的gdb命令是完全相同的,下面以代码清单22.2的应用程序为例演示gdb调试器的用法。 1 int add(int a, int b) 2 { 3 return a + b; 4 } 5 6 main() 7 { 8 int sum[10] = 9 { 10 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 11 } ; 12 int i; 13 14 int array1[10] = 15 { 16 48, 56, 77, 33, 33, 11, 226, 544, 78, 90 17 }; 18 int array2[10] = 19 { 20 85, 99, 66, 0x199, 393, 11, 1, 2, 3, 4 21 }; 22 23 for (i = 0; i < 10; i++) 24 { 25 sum[i] = add

03 调试事件的处理

与世无争的帅哥 提交于 2019-12-06 04:10:27
【太多事情要做了,这部分难度对我来说又很大,先写一下大体框架,到时候具体函数逆向分析过程给写出来】 问题: 1. 建立被调试程序时接收的第一个调试事件是什么? 2. 该事件在内核中的生成流程是什么? 3. 其初始化下断点时如何判断是否是被调试程序(而不是一般程序)? 4. 关于调试的内核函数中为何要发送虚假消息(**fake**)? 一、创建进程时的第一个调试事件    一个简单的创建被调试进程的案例   在这个例子中,简单地以调试模式打开 记事本.exe, 发现其首先会接收到一个异常事件。      当调试进程创建或附加被调试进程之后,其会在被调试进程中下一个int 3断点。   其函数的经过如下:(注:当函数太大时,可以通过 IDA的Cross Reference 函数来逆向推出被调试程序)      注意:在内核中进程的初始化一般都会调用 LdrpInitializeProcess,但不是每个进程都会被下断点。   如下图,其会检测 PEB+0x2处    二、 发送虚假消息   当某一进程以附加的形式调试时,其会调用 DebugActive 之类的函数。   在函数内部会发送假消息,为什么需要发送假消息呢?    因为该进程已经被创建,DLL模块也已经被加载了。   但调试器需要其DLL模块等被调试程序的信息,此时被调试进程需要发送虚假的消息

Linux gdb调试器用法全面解析

这一生的挚爱 提交于 2019-12-06 01:16:29
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/21cnbao/article/details/7385161 更多精华文章请扫描下方二维码关注Linux阅码场 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,GDB主要可帮助工程师完成下面4个方面的功能: 启动程序,可以按照工程师自定义的要求随心所欲的运行程序。 让被调试的程序在工程师指定的断点处停住,断点可以是条件表达式。 当程序被停住时,可以检查此时程序中所发生的事,并追索上文。 动态地改变程序的执行环境。 不管是调试Linux内核空间的驱动还是调试用户空间的应用程序,掌握gdb的用法都是必须。而且,调试内核和调试应用程序时使用的gdb命令是完全相同的,下面以代码清单22.2的应用程序为例演示gdb调试器的用法。 1 int add(int a, int b) 2 { 3 return a + b; 4 } 5 6 main() 7 { 8 int sum[10] = 9 { 10 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 11 } ; 12 int i; 13 14 int array1[10] = 15 { 16 48, 56, 77, 33, 33, 11, 226, 544,