程序调试

每个开发人员必须知道PDB文件知识

和自甴很熟 提交于 2019-12-05 23:40:26
大多数开发人员都意识到PDB文件有助于您进行调试,但仅此而已。如果你不知道PDB文件是怎么回事,不要觉得很糟糕,因为虽然有文档在那里,但它分散在周围,而且大部分是为编译器和调试器编写器准备的。虽然编写编译器和调试器非常酷和有趣,但这可能不是你的工作。 我想做的是把每个在微软操作系统上进行开发的人都必须知道的PDB文件放在一个地方。这些信息也适用于本机开发人员和托管开发人员,不过我将提到一个特定于托管开发人员的技巧。我将从讨论PDB文件存储和内容开始。由于调试器使用PDB文件,我将详细讨论调试器如何为二进制文件找到正确的PDB文件。最后,我将讨论调试器在调试时如何查找源文件,并向您展示一个与调试器如何查找源代码相关的常用技巧。 在我们开始之前,我需要定义两个重要的术语。在开发计算机上执行的生成是私有生成。在生成计算机上完成的生成是公共生成。这是一个重要的区别,因为调试在本地生成的二进制文件很容易,总是公共生成导致问题。 所有开发人员需要知道的最重要的事情是:PDB文件和源代码一样重要!很多公司没有人能找到在生产服务器上运行的构建的PDB文件。如果没有匹配的PDB文件,您的调试挑战几乎是不可能的。通过大量的努力,可以在没有正确的PDB文件的情况下找到问题,但是如果您首先拥有正确的PDB文件,它将为您节省大量的资金。 正如Visual Studio的开发经理约翰坎宁安(John

为什么我的堆栈上会有奇怪的函数名?(关于符号的讨论)

半城伤御伤魂 提交于 2019-12-05 23:01:35
符号可以包含有关全局变量、局部变量、函数名、参数、结构和源行号的信息。符号有三种类型:导出符号、pdb符号(公共符号)和专用pdb符号(专用符号)。 导出符号是dll本身的一部分。例如,ntdll.dll和kernel32.dll将其函数的很大一部分公开为导出符号,因此可以将它们称为API,但是在进程中发现的大多数dll都有一组非常小的导出符号。通常导出符号不包含函数的参数信息,并且由于很少有函数以这种方式公开,因此当只有导出符号时,您不能真正依赖堆栈的有效性。 公共符号包含一些基本符号,如函数名和全局变量,但同样,并非所有函数名都在公共符号中公开。dll的开发人员选择公开什么作为公共符号,因此他/她可以隐藏任何他们认为会泄露太多有关实现信息的内容。私人符号包含第一段中列出的几乎所有内容 调试时,通过将dll/exe链接到符号文件的GUID,符号与相应的dll或exe匹配。这意味着,如果符号搜索路径中有多个ntdll.pdb,调试器将知道哪个对应于特定版本的ntdll.dll。搜索路径由.sympath指定,除sympath中列出的内容外,调试器还将查找加载dll的目录以及环境变量 _NT_SYMBOL_PATH 中给定的路径中的任何内容。 如果符号是错误的的时候会发生什么? 让我们看看这个带有mscorsvr.dll公共符号的堆栈: 54 Id: 62c.1590 Suspend

Linux调试

我是研究僧i 提交于 2019-12-05 22:48:38
Linux调试: makefile中-g加上————编译 进入到可执行程序文件夹 1、gdb TestLinux(进入gdb模式) 2、l(查看当前代码) 3、b linenumber(设置断点) 4、r(执行) 5、s(逐步执行,进入函数) 6、回车(重复上一条命令) 7、print variable_name(查看某个变量的变化) 8、whatis variable_name(查看变量类型) 9、bt(查看函数的堆栈) 10、finish (结束调试) 11、n (单步执行) 12、q (退出调试) 来源: https://www.cnblogs.com/juluwangshier/p/11949209.html

LLDB调试详解--逆向开发

二次信任 提交于 2019-12-05 22:14:56
前言 今天讲述在苹果日常开发中一个装逼神器LLDB,是Xcode内置的动态调试工具. 在iOS系统程序开发中,会经常需要代码调试的追踪, 最常用的也是LLDB(low level debugger) .LLDB能更好的辅助开发者通过各种手段如修改变量进行测试,甚至能协助开发同学来定位bug. LLDB是新一代高性能的调试器, 也是Mac OSX上Xcode的默认调试器, 支持在桌面和iOS设备模拟器上调试C,OC和C++以及Swift. 帮助 LLDB命令的格式如下: <命令名称> <命令动作> [-可选项 [可选项的值]] [参数1 [参数2...]] LLDB命令是由各部分空格分割, 如果参数是包含空格, 则需要双引号括起参数,如果参数本身中包含双引号或反斜杠, 就需要使用反斜杠来进行转义. LLDB命令是非常多的, 完全记录下来是不可能的, 而且还没有必要. 可以利用help命令查看相关LLDB命令的用法.如下: 三、LLDB常见命令 3.1 breakpoint指令 示例Demo1   func test1(str: String) { self.test2(str: str) } func test2(str: String) { self.test3(str: str) } func test3(str: String) { print(str) } override

每周分享五个 PyCharm 使用技巧(六)

随声附和 提交于 2019-12-05 21:42:41
大家好,今天我又来给大家更新 PyCharm 的使用技巧。 从今年3月24号开始一直到今天,将近四个月的时间。包括本篇,一共更新了6篇文章,每篇 5 个小技巧,总计 30 个。 这30个使用技巧,全部是我自己在使用 PyCharm 中认为比较有用的,抽取出来分享给大家,有一些虽然只是一个小小的配置,但是配置好了,在使用过程却能节省不少的时间。 这是本系列的第六篇文章,同时也是最后一篇文章。不知道正在看这篇文章的你,看了这个系列后,是否会有一点帮助?若有,那我花时间整理的这些就真的值了。 照例,如果你还未看过前五篇,可以点此进行查看。 1、 每周分享五个 PyCharm 使用技巧(一) 2、 每周分享五个 PyCharm 使用技巧(二) 3、 每周分享五个 PyCharm 使用技巧(三) 4、 每周分享五个 PyCharm 使用技巧(四) 5、 每周分享五个 PyCharm 使用技巧(五) 26 文件差异,轻松比对 程序开发必备神器中,beyond compare 绝对可以排一号。 虽说好用,但这东西,是收费的。 如果是简单的单个文件的比对,其实可以使用PyCharm里自带的。 点击源文件,再点击 View -> Compare With … -> 选择目标文件 对比示例,可以查看下面这张图,UI做的还是挺好看的。 27 以列为单位的块编辑 先给你出道小题,像下面这段代码

教女朋友学Python3-如何使用 Pycharm 进行调试

假装没事ソ 提交于 2019-12-05 20:31:55
2018/06/27 星期三 教女朋友学Python3-如何使用 Pycharm 进行调试 程序调试可以帮助我们自己快速的找到问题所在,程序写完之后,如果没有出现什么问题这几乎是「不存在」的。 通常当我们的程序出现错误的时候,会抛出「异常」,异常就是我们解决的程序的 bug 的利器。如果再合理的配合「日志」文件,那么就可以很快的定位到出现 bug 所在的代码行。 程序运行的时候经常会出现 错误,提示我们代码出现问题,但是很多人往往会去忽视抛出来的错误信息带给我们的价值。 往往就是直接的选择忽视。 启动调试 启动调试的基础就是我们首先需要设置好「断点」,设置断点开启 「调试」模式。 设置「断点」我们就可以 右键 → debug 就可以开始进入调试模式,程序会在自动它设定的第一个断点出停止。 上面主要说明了 debug 模式下,不同面板的功能。 重点在于不同的「调试按钮」 主要调试按钮如下: 其中(上图红色框框从左到右) ↓ 标记的按钮按钮: 按行 运行,每次只会运行到下一行 ↘ 标记的按钮按钮:按行进行,如果遇见 方法 会执行到「方法」内部。 ↘ 标记的按键按钮:同上面的↘,但是会强制进入。 ↗ 标记的按键按钮:对应于↘,该按钮会直接的退出当前内部执行的「方法」,返回上一个模块 ↘I 标记的按键按钮:表示直接执行到「鼠标」指向所在的行。 调试的过程是不允许回退的,如果发现出现问题

Android Studio奇淫巧技

杀马特。学长 韩版系。学妹 提交于 2019-12-05 20:00:45
目录 3.1 Android Studio使用初探 Project面板 Stucture面板 Android Monitor Keymap Tip of the Day 快速查找 Search Action 演示模式 3.2 Android Studio使用进阶 操作与导航 快速重构 代码模板 内置模板 自定义代码注释模板 代码分析 在Android Studio中进行版本管理 3.3 Android Studio新功能 项目模板 ThemeEditor Image Asset&&Vector Asset Android Monitor Instant Run Productivity Guide 3.4 Android Studio插件 Ignore 自动生成代码类插件 主题插件 3.5 Android Studio资源网站 Android Studio中文社区 Android Studio问答社区 3.1 Android Studio使用初探 本人感觉这章对刚使用 Android Studio的初学者来说很有用,里面很多技巧需要自己慢慢摸索,建议养成使用快捷键的习惯,久而久之,会给你的编程带来极大的效率。本章作者主要以Mac的快捷键来介绍的,文章最后会给出快捷键附录 Project面板 在Android Studio最左边可以找到Project标签,这里是开发者管理项目的地方

eclipse远程调试两种模式(java)

柔情痞子 提交于 2019-12-05 15:20:43
eclipse远程调试两种模式: 一、服务端监听 (1)服务器端需执行程序前加参数 -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000 说明:server=y 是指目标应用程序作为服务监听将要连接的远程调试器(常用); suspend=y 是指目标VM将暂停,直到调试器应用程序进行连接(若需要调试启动错误,很有用); suspend=n 是指目标VM不暂停; address=8000 监听端口。 (2)运行服务端程序,程序将暂停 (3)eclipse ==> Debug Configurations ==> Remote Java Application 新建测试工程 (4)选择工程 ==> 模式 Socket Attach ==> 调试服务器IP ==> 调试端口(这里假设8000) (5)运行debug 二、调试端监听(不常用) (1)eclipse ==> Debug Configurations ==> Remote Java Application 新建测试工程 (2)选择工程 ==> 模式 Socket Listen ==> 调试监听端口(这里假设8000) ==> Allow termination of remote VM 打勾 (3)运行debug,程序将暂停,左上显示

Dev-C++debug使用方法

冷暖自知 提交于 2019-12-05 15:11:37
最基本的调试既是在程序中插入输出语句输出某些变量的值,以检查程序运行到此处时,变量的变化是否符合设想。 当使用 源代码文件格式 时,可以=将某段调试输出这样写: #ifdef _mydebug//调试开始 cout << "This is a debug message\n"; /*以下时调试内容*/ cout << ""The debug prosess is over" << endl; #endif//调试结束 若为工程文件则应该 参考如下方法: https://blog.csdn.net/qq_43347097/article/details/97000762 来源: https://www.cnblogs.com/theSunAndSnow/p/11930161.html

深入浅出Node.js

≡放荡痞女 提交于 2019-12-05 14:31:58
深入浅出Node.js 一直想致力于写一篇关于广义讲解Node.js系统的文章,苦于时间有限,资源有限。这篇文章是在结合自己的学习心得以及与行业大佬共同探讨下争对于熟练掌握JS语言后的广义Node.js.至于为什么叫作广义在后文会提到。希望看到这篇文章后可以激发大家对Node.js的学习兴趣,这篇文章的初衷就是致力于帮助大家可以走进Node.js世界。 简介: Node.js 就是运行在服务端的 JavaScript。 Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台。 Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非 常好。 底层选择用c++和v8来实现的 注意:广义的Node.js是指不掌握以底层C++技术以及V8知识,利用Node.js运行在服务端的JS特性完成操作,很多小伙伴会产生疑惑Node.js是什么,简单的来说:Node.js是解析器. 优势: RESTful API 这是NodeJS最理想的应用场景,可以处理数万条连接,本身没有太多的逻辑,只需要请求API,组织数据进行返回即可。它本质上只是从某个数据库中查找一些值并将它们组成一个响应。由于响应是少量文本,入站请求也是少量的文本,因此流量不高