程序调试

IDA动态调试技术及Dump内存

扶醉桌前 提交于 2019-12-31 02:04:01
IDA动态调试技术及Dump内存 来源 https://blog.csdn.net/u010019468/article/details/78491815 最近研究SO文件调试和dump内存时,为了完整IDA调试起来,前后摸索了3天才成功,里面有很多坑和细节,稍微不注意,就一直排行,需要理解每步骤的作用意义,否则就会觉得教程不对,要详细的教程可能找不到,大部分都是简单介绍,没有提醒细节和易忽视的点 动态调试步骤,顺序严格如下 事先准备工作 1、要求root手机或者直接用模拟器 否则没有权限启动android_server 2、IDA在6.6以上版本 或者手机为5.0以下 否则会出现 pie异常: error: only position independent executables (PIE) are supported. 1 细步骤如下:: 1、首先把IDA安装目录下的android_server文件通过adb push 命令push到手机/data/local/tmp/目录下,并通过root权限身份运行./android_server C:\Windows\System32>adb shell shell@HWGRA:/ $ cd /data/local/tmp/ shell@HWGRA:/data/local/tmp $ ./android_server IDA

动态追踪技术-简介

前提是你 提交于 2019-12-31 02:03:44
个人认为此文对动态追踪的东西介绍比较宽泛,但可用于指导学习动态追踪技术知识。特此转载。原文地址: http://openresty.org/posts/dynamic-tracing/#rd?utm_source=tuicool&utm_medium=referral 动态追踪技术漫谈 关于作者 大家好,我是章亦春,网名 agentzh。很多朋友可能是通过我做的一些开源项目了解到我的,比如我创立的 OpenResty 开源项目,再比如我编写的很多 Nginx 的 第三方模块 ,我从大学时代就开始贡献的 Perl 开源模块 ,以及最近一些年写的很多 Lua 方面的库。我的兴趣比较广泛,喜欢抽象层次很高也比较花哨的东西,比如函数式和逻辑式编程语言;同时又对很底层的东西非常感兴趣,比如操作系统、Web 服务器、数据库、高级语言编译器等系统软件;尤其喜欢构建和优化较大规模的互联网应用系统。 什么是动态追踪 我很高兴能在这里和大家分享动态追踪技术(Dynamic Tracing)这个主题,对我个人来说也是一个很激动人心的话题。那么,什么是动态追踪技术呢? 动态追踪技术其实是一种后现代的高级调试技术。它可以帮助软件工程师以非常低的成本,在非常短的时间内,回答一些很难的关于软件系统方面的问题,从而更快速地排查和解决问题。它兴起和繁荣的一个大背景是,我们正处在一个快速增长的互联网时代,作为工程师

他山之石:调试之剑

家住魔仙堡 提交于 2019-12-30 19:21:47
弗雷德里克·布鲁克斯( F r e d e r i c k P·B r o o ks ) 博士在他那篇著名的《没 有 银弹— 软件工程 中的根本和次要问 题》 一文 中 , 将软件项目比作可怕的人狼 (w e r e w o l v e s ) , 并大胆地预言十年内不会 找到特别有效 的银 弹 。 该论文发表的时 间是 19 8 6 年 , 如今整整 2 0 年过去了 , 尽 管不时有人惊呼找到 了神奇的银弹 , 但是 冷静的人们很快发现那只是美好的愿望 。 如果说 软件工业 中与人狼 的战 斗还在持续 , 那么在这些战役 中一 定会有程 序 员的身影 , 笔者 也是 其中的一个。 我的 编程生涯是从使用汇编语言编写 D O S 下 的 T SR 程序开始的。 今天 D O S 操作 系统 已经成为历史 , 在那个年代最值得炫 耀 的 T S R 技术也早 已经过时了 。 十几年 中 ,O W L、V F W、V D X、ISA P I、A e ti v e M o v i e 等技术也被 时间淘汰… …然而 , 在这漫 长的时间当中 , 我最看重的是软件调试技术。它是十几年中我学到的最有用、一直受用、而且 日久弥新的一项技术。 从软件 工程 的角度来讲 , 软件调试 是软件 工程 的一个重要部分 , 软件调试 过程 出现在软 件工程的各个阶段 。 从最初的可行性分析、原型验证

C# Debug

依然范特西╮ 提交于 2019-12-30 04:30:41
语法、IDE环境使用、Debug方法是学习一门语言的 最少必须技能 ,本文总结C#中的最常用调试方法 一、 断点 如下图所示在欲插入断点的地方右键》断点》插入断点(或在行号左边点击)可在选中语句上插入断点: Debug模式下程序运行到断点所在语句时会阻塞在该语句上,如下图所示 此时可以通过工具栏上“逐语句”、“逐过程”、“跳出”即 来进行调试,调试期间光标放在变量上可以显示变量的当前值。 二、 跟踪点 在图1中,不仅可以插入断点,也可插入跟踪点,跟踪点是一种特殊的断点,可以配置为满足一定条件后才命中该断点,并可以将重要信息输出到Output窗口,类似于Debug.WriteLine(),它实际上是输出 调试 信息且不修改代码的一种方式。 根据配置不同跟踪点有如下三种形状,从上到下依次为 输出信息并阻塞 输出信息不阻塞 条件性阻塞并输出信息 三、 Debug与Trace类记录调试信息 //System.Diagnostics.Debug类与System.Diagnostics.Trace可用于记录并输出调试信息 System.Diagnostics.Debug.Write("info"); System.Diagnostics.Debug.WriteIf(true, "info"); System.Diagnostics.Debug.WriteLine("info"); System

Redis5源码阅读【3-Redis编译与GDB调试】

家住魔仙堡 提交于 2019-12-29 19:30:05
文章目录 1、介绍 2、Redis编译 2.1、获取源码 2.2、目录介绍 2.3、编译前的准备 2.4、开始编译 3、GDB调试 3.1、安装GDB 3.2、GDB调试编译好的Redis 3.2.1、GDB模式启动 3.2.2、在Redis源码上打断点 4、结束 1、介绍 本章主要是为了介绍Redis的编译方式,以及使用GDB对Redis进行调试的方法,为后面讲解源码打下基础,同时也介绍GDB这个C语言代码调试利器的部分使用 2、Redis编译 Redis编译应该是一个必须掌握的技能,毕竟很多时候我们并不一定会直接使用Redis编译好的包类型,可能会更具当前操作系统的情况,调整部分源码编译后再使用,例如Redis5当前的版本是不支持Windows的,如果大家想要使用Windows版本的Redis最好去官网下载Redis3以及之前的版本去自行编译使用,此外当大家希望能在Redis中加入一些日志或者其它东西的时候,一样需要修改源码进行编译,那么下面就介绍一下官方的推荐的编译步骤(很简单的) 2.1、获取源码 自行编译的第一步当然就算获取源码,Redis获取源码的方式最直接的就是github,这里我贴出Redis的github地址: https://github.com/antirez/redis ,或者你可以通过github搜索Redis: 当然github上面的是最新版本的代码

pdb文件 小结

泄露秘密 提交于 2019-12-29 05:48:58
.pdb文件,是VS生成的用于调试的符号文件(program database),保存着调试的信息。在VS的工程属性,C/C++,调试信息格式,设置/Zi,那么VS就会在构建项目时创建PDB文件。 在这里要区分两种情况: 1、构建静态库时,可以在工程属性 –> C/C++ –> 输出文件 –> 程序数据库名 设置生成的pdb文件名称,如果不指定,默认是生成为VCx0.pdb,这里x是VS版本号,例如用VS2005,就会生成VC80.pdb。这里就会产生一个疑问,编译静态库时默认生成的.pdb文件名字都一样,那引用这个静态库的项目最后能找到正确的.pdb文件吗?答案是肯定的,因为VS会在生成的文件中嵌入 .pdb 文件的路径。 举个例子,在Project/ToolA下,构建了一个静态库ToolA.lib,对应生成一个vc80.pdb,同样在在Project/ToolB下,构建了一个静态库ToolB.lib,对应生成一个vc80.pdb。然后最终的工程Work.exe同时链接了这两个静态库.这时,生成Work.pdb的时候,就会在ToolA.lib中找到它对应的符号文件路径Project/ToolA/vc80.pdb,以及ToolB.lib对应的符号文件路径Project/ToolB/vc80.pdb,合并生成最终工程的Work.pdb。 2、构建可执行文件或动态库,这种情况下

Android Debug Bridge(adb)

有些话、适合烂在心里 提交于 2019-12-28 17:39:44
Adb google官方文档翻译,源文档地址如下 https://developer.android.google.cn/studio/command-line/adb Android Debug Bridge(adb) Android调试桥(adb)是一种多功能的命令行工具,可让您与设备进行通信。adb命令可促进各种设备操作,例如安装和调试应用程序,并提供对Unix shell的访问,您可使用该shell在设备上运行各种命令。它是一个客户端服务器程序,包括三个组件: 客户端 ,发送命令。客户端在您的开发计算机上运行。您可以通过发出adb命令从命令行终端调用客户端。 守护程序(adbd) ,它在设备上运行命令。守护程序在每个设备上作为后台进程运行。 服务器 ,管理客户端和守护程序之间的通信。服务器在开发计算机上作为后台进程运行。 adb 包含在Android SDK平台工具包中。您可以使用 SDK Manager 下载该软件包,然后将其安装在 android_sdk/platform-tools/ 。或者,如果您需要独立的Android SDK平台工具包,则可以 在此处下载 。 有关连接设备以在ADB上使用的信息,包括如何使用连接助手解决常见问题的信息,请参阅 在硬件设备上运行应用程序 。 adb 如何工作 启动adb客户端时,客户端首先检查是否已在运行adb服务器进程。如果没有

Linux C/C++ Memory Leak Detection Tool

北城余情 提交于 2019-12-28 13:20:41
目录 1. 内存使用情况分析 2. 内存泄漏(memory leak) 3. Valgrind使用 1. 内存使用情况分析 0x1: 系统总内存的分析 可以从proc目录下的meminfo文件了解到当前系统内存的使用情况汇总,其中 可用的物理内存 = memfree + buffers + cached 当memfree不够时,内核会通过回写机制(pdflush线程)把cached和buffered内存回写到后备存储器,从而释放相关内存供进程使用,或者通过手动方式显式释放cache内存: echo 3 > /proc/sys/vm/drop_caches $cat /proc/meminfo MemTotal: 8388608 kB MemFree: 6880760 kB Buffers: 0 kB Cached: 1490828 kB SwapCached: 0 kB Active: 1224960 kB Inactive: 282832 kB Active(anon): 17028 kB Inactive(anon): 348 kB Active(file): 1207932 kB Inactive(file): 282484 kB Unevictable: 0 kB Mlocked: 4884 kB SwapTotal: 1999864 kB SwapFree:

调试NO_MORE_USER_HANDLES问题

前提是你 提交于 2019-12-28 11:25:49
文章目录 问题描述 分析过程 问题描述 一台站机管理m台分机,测试多分机时,发现如下现象:当分机数位400时,界面卡死;当分机数为200时,一切正常。 由于界面刷新是通过定时器来不停刷新界面的,于是在定时器处理函数中添加断点。但该断点一直没执行。 在msdn上查Cwnd::SetTimer说明,该函数正常返回非零数值,失败则返回零。检查SetTimer返回值,在失败情况下,通过GetLastError()获取最近的错误代码。结果发现SetTimer失败,错误码为1158. 在MSDN是这样藐视1158的: ERROR_NO_MORE_USER_HANDLES 1158 (0x486) The current process has used all of its system allowance of handles for Window Manager objects. 分析过程 不清楚“handles for window manager objects”什么意思,字面意思是窗口管理对象句柄。于是通过“任务管理器”来查看该软件对应的句柄数和线程数,结果发现句柄数和线程数分别为555和14,和其他进程对比,并不是特别多。 在网上搜索相关资料,有篇文章说,打开“任务管理器”的"用户对象"列,观察其数值,如果接近10000,就必须优化(操作系统为每个进程最多分配10000个用户对象)

远程调试,你值得拥有

我与影子孤独终老i 提交于 2019-12-27 16:41:21
1. 简单理解   远程调试就是用本地的代码调试服务器上的代码,稍微想想怎么能做到呢,肯定是本地和远程服务上的虚拟机之间实现了相互通讯啊.。术语话一点,就是本地和远程的JVM之间基于某种协议(debug协议)以套接字(socket) 的方式实现通信,从而实现在本地远程调试服务端代码的功能。既然是以套接字的方式,那可定就有服务端和客户端的概念。这里不要思维定势了,所谓服务端和客户端是相对的,并不是说你部署服务的远程端才叫服务端,实际上,只要你喜欢,你可以将本地IDE配置成服务端,让远程服务启动后来主动连接本地,当然,通常的方式还是顺势思维,就把远程配置为socket的服务端,监听客户端;而且连接的建立都是服务端先启动后监听特定端口,等待客户端连接。 3. 命令环境   在运行java -jar命令来启动的项目如内嵌服务器(如Jetty)或者只是简单的运行 main 方法的场景下,想要远程调试,也很简单,就是在启动时添加远程调试相应的参数,下面为博主测试jar包环境下配置参数,完全可以拿去即用的——     java -Xdebug -Xrunjdwp:transport=dt_socket,server=n,address=9999,suspend=n -jar debug.jar   参数释疑:     -XDebug 启用调试模式;     -Xrunjdwp