程序调试

(转载)与调试器共舞

瘦欲@ 提交于 2020-03-10 16:46:26
你是否曾经苦恼于理解你的代码,而去尝试打印一个变量的值? NSLog(@"%@", whatIsInsideThisThing); 或者跳过一个函数调用来简化程序的行为? NSNumber *n = @7; // 实际应该调用这个函数:Foo(); 或者短路一个逻辑检查? if (1 || theBooleanAtStake) { ... } 或者伪造一个函数实现? int calculateTheTrickyValue { return 9; /* 先这么着 ... } 并且每次必须重新编译,从头开始? 构建软件是复杂的,并且 Bug 总会出现。一个常见的修复周期就是修改代码,编译,重新运行,并且祈祷出现最好的结果。 但是不一定要这么做。你可以使用调试器。而且即使你已经知道如何使用调试器检查变量,它可以做的还有很多。 这篇文章将试图挑战你对调试的认知,并详细地解释一些你可能还不了解的基本原理,然后展示一系列有趣的例子。现在就让我们开始与调试器共舞一曲华尔兹,看看最后能达到怎样的高度。 LLDB LLDB 是一个有着 REPL 的特性和 C++ ,Python 插件的 开源 调试器。LLDB 绑定在 Xcode 内部,存在于主窗口底部的控制台中。调试器允许你在程序运行的特定时暂停它,你可以查看变量的值,执行自定的指令,并且按照你所认为合适的步骤来操作程序的进展。( 这里

Visual Studio调试DLL项目

时光总嘲笑我的痴心妄想 提交于 2020-03-10 09:48:22
若要从 DLL 项目而不是从调用应用程序启动调试,必须在“<项目> 属性页”对话框或窗口中输入信息以指示 DLL 项目在何处才能找到调用应用程序。 C++“属性页”在布局和内容方面与 C# 和 Visual Basic“属性页”不同。请参考与项目语言相对应的过程。如果托管 DLL 由本机代码调用,并且您希望调试两者,则必须同时启用托管调试器和本机调试器。 可以在“<Project> 属性页”对话框或窗口中设置此项。 在 C++ 项目中指定调用应用程序 在“解决方案资源管理器”中选择 DLL 项目。 在“视图”菜单上选择“属性页”。 在“项目 属性页”窗口中的“配置”下拉列表中,选择“调试”。 打开“配置属性”文件夹并选择“调试”类别。 在“要启动的调试器”列表中,选择“本地 Windows 调试器”或“远程 Windows 调试器”。 在“命令”或“远程命令”框中单击下拉箭头,并从列表中选择“浏览”来找到应用程序。 或者,键入应用程序的路径和名称。 在“命令参数”框中键入所有需要的程序参数。 在 C# 项目中指定调用应用程序 在“解决方案资源管理器”中选择 DLL 项目。 在“视图”菜单上选择“属性页”。 在“项目 属性页”窗口中的“配置”下拉列表中,选择“调试”。 单击“调试”选项卡。 可通过执行以下任一操作来启动应用程序: 将“启动操作”设置为“启动外部程序”。 在

pytest 调试用例脚本时出现Empty suite

末鹿安然 提交于 2020-03-10 09:44:55
一、问题描述: 写完用例后,右键执行run 'pytest for XXX'本程序,出现Empty suite;执行用例实好实坏,有时可正常执行 二、问题解决 1.原因是我右键时,是在具体一个方法上执行的右键,运行的不是整个文件,是执行类 2.解决:在具体类外面右键运行整个文件 (莫名其妙的问题~~~~~~) 三、使用指令执行脚本时,报导入的模块不存在错误(导入上级目录中的模块): 解决办法:(参考链接: https://blog.csdn.net/weixin_43843287/article/details/89703774?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task ) import os import sys path = os.path.dirname(sys.path[0]) if path not in sys.path: sys.path.append(path) 来源: CSDN 作者: 笃姬研 链接: https://blog.csdn.net/aisi0308/article/details/104749916

[原译]11个高效的VS调试技巧

泪湿孤枕 提交于 2020-03-10 09:14:57
介绍 调试是软件开发周期中的一个很重要的部分,有时很有挑战性,有时候则让程序员迷惑,有时候让程序员发疯,但是。可以肯定的是,对于任何不是太那个微不足道的程序来说,调试是不可避免的。近年来,调试工具的发展已经使得很多调试任务简单省时了。 本文总结了十个调试技巧,当你使用VS的时候可以节省你很多时间。 1.悬停鼠标查看表达式 调试有时候很有挑战性,当你步入一个函数想看看哪块出错的时候,查看调用栈来想想值是从哪来的。另一些情况下,则需要添加一些监视表达式,或者查看局部变量列表,这通常还是花费一些时间的,但是。如果你把你鼠标指向你感兴趣的一个变量。你会发现事情简单多了。而且,类和结构体可以通过单击展开。这样。你就可以方便快捷的找到你想查看的变量了。 2实时改变值 调试器不仅仅是一个分析程序崩溃或是异常结果的工具了,许多bug都可以通过步入新写的函数,检查函数是否如期望的那样运行来预防。有时候你可能会好奇“如果条件为真函数会正确运行吗”大多数情况下,根本不需要改变代码重启挑起,仅仅把鼠标悬停到一个变量上,双击值然后输入一个新值就可以了。。 3.设置下一条语句 一个典型的调试情况就是通过单步跟踪分析为什么一个函数调用失败了。当你发现一个函数调用的另一个函数返回错误的时候你会怎么做?重启调试?有更好的方法。拖动这个黄色的语句标识到你想下一步执行的语句前就可以了。比如你刚才失败的那块,然后步入

Linux-proc文件系统介绍

时光怂恿深爱的人放手 提交于 2020-03-10 03:24:03
1、操作系统级别的调试 (1)、简单程序单步调试 (2)、复杂程序printf打印信息调试 (3)、框架体系日志记录信息调试 (4)、内核调试的困境 2、proc虚拟文件系统的工作原理 (1)、Linux内核是一个非常庞大、复杂的一个单独的程序,对于这样的一个程序来说,调试是非常的复杂的。 (2)、像kernel这样庞大的项目,给里边添加/更改一个功能是非常麻烦的,因为你这个添加的新功能可能会影响其他已经有的功能。 (3)、早期内核版本中尽管调试很麻烦,但是高手们还可以凭借自己超凡脱俗的能力去驾驭。但是到了2.4左右的版本的时候,这个难度就非常大了。 (4)、为了降低内核调试和学习的难度,内核开发者们在内核中添加了一些属性专门用于调试内核,proc文件系统就是一个尝试。 (5)、proc文件系统的思路就是:在内核中构建一个虚拟文件系统/proc,内核运行时将内核中一些关键的数据结构以文件的方式呈现在/proc目录中的一些特定文件中,这样相当于将不可见的内核中的数据结构以可视化的方式呈现给内核的开发者。 (6)、proc文件系统给了开发者一种调试内核的方法:我们通过实时的观察/proc/xxx文件,来观看内核中特定数据结构的值,在我们添加一个新功能的前后来对比,就可以知道这个新功能产生的影响对不对了。 (7)、proc目录下的文件大小都是0,因为这些文件本身并不存在于硬盘中

[转]程序员必读书单(转)

拈花ヽ惹草 提交于 2020-03-09 16:39:14
作者: Lucida 微博: @peng_gong 豆瓣: @figure9 原文链接: http://lucida.me/blog/developer-reading-list/ 关于 本文把程序员所需掌握的关键知识总结为三大类19个关键概念,然后给出了掌握每个关键概念所需的入门书籍,必读书籍,以及延伸阅读。旨在成为最好最全面的程序员必读书单。 前言 Reading makes a full man; conference a ready man; and writing an exact man. Francis Bacon 优秀的程序员应该具备两方面能力: 良好的 程序设计 能力: 掌握常用的数据结构和算法(例如链表,栈,堆,队列,排序和散列); 理解计算机科学的核心概念(例如计算机系统结构、操作系统、编译原理和计算机网络); 熟悉至少两门以上编程语言(例如C++,Java,C#,和Python); 专业的 软件开发 素养: 具备良好的编程实践,能够编写可测试(Testable),可扩展(Extensible),可维护(Maintainable)的代码; 把握客户需求,按时交付客户所需要的软件产品; 理解现代软件开发过程中的核心概念(例如面向对象程序设计,测试驱动开发,持续集成,和持续交付等等)。 和其它能力一样, 程序设计 能力和 软件开发 素养源自项目经验和书本知识

调试环境的搭建

时光总嘲笑我的痴心妄想 提交于 2020-03-09 14:32:11
在Hello DTOS中,使用汇编语言直接基于x86架构的硬件完成了第一个主引导程序,实在是大功一件。 Hello DTOS博客中,存在着这样一个问题:在开发的过程中没有任何可用的调试环境,当主引导程序越来越复杂时,出现bug根本没法调试。 本篇博客就来搭建高效可用的调试环境 调试环境搭建(上) 问题:如何调试主引导区的代码? Bochs(另一款优秀的虚拟机软件) -专业模拟x86架构的虚拟机 -开源且高度可移植,由C++编写完成 -支持操作系统开发过程中的中断调试 -通过简单配置就能运行绝大数主流的操作系统 支持调试功能的Bochs版本 1. 下载源码:https://sourceforge.net/projects/bochs/files/ 2. 解压缩bochs-2.x.x.tar.gz->bochs-2.x.x 3. 进入源码目录:cd bochs-2.x.x 4. ./configure --enable-debugger --enable-disasm 5. make 6. sudo make install 安装完成bochs后,直接运行bochs,会出现崩溃,为什么? 调试环境搭建(中) -确定bochs的安装路径(which bochs) -安装vgabios(apt-get install vgabios) -确定vgabios的安装路径(whereis

调试环境搭建

蹲街弑〆低调 提交于 2020-03-09 14:26:28
操作系统相关的代码,始终还是代码,即肯定需要相应的调试工具。 Bochs是一种十分轻便的使用c++编写的开源IA-32(x86)电脑模拟器,可以运行在最受欢迎的平台上。能仿真英特尔x86 CPU、常见的I/O设备、和定制的BIOS, 支持断点调试,调试方法和GDB非常相似。 现在官网下载Bochs的源码: 然后将其拷贝到ubuntu下:解压缩: tar -zxvf bochs-2.4.5.tar.gz 然后执行: ./configure --enable-debugger --enable-disasm 此时可能会报错 : ERROR: X windows gui was selected, but X windows libraries were not found. 解决办法: sudo apt install xorg-dev但是此时可能又会出现这样的情况: 0% [Connecting to archive.ubuntu.com (2001:67c:1360:8001::21)] 解决办法: 先执行: sudo nano /etc/gai.conf 然后找到这行命令: #precedence ::ffff:0:0/96 100 把“#“去掉,保存退出即可。 再次执行 sudo apt install xorg-dev 即可安装成功。 然后,再运行: ./configure

Hi35xx NVR GDB调试

Deadly 提交于 2020-03-09 07:30:00
Hi35xx NVR GDB调试 1. 下载 gdb 源代码 嵌入式 Linux 的 GDB 调试环境由 Host 和 Target 两部分组成, Host 端使用 arm - linuxgdb , T arget Board 端使用 gdbserver 。这样,应用程序在嵌入式目标系统上执行。而 gdb 调试在 Host 端,所以要採用远程调试 (remote) 的方法。进行 GDB 调试。目标系统必须包含 gdbserver 程序 ( 在主机上正对硬件平台编译成功后下载到目标机上 ) ,宿主机也必须安装 GDB 程序。 一般 Linux 发行版中都有一个能够执行的 GDB ,但开发者不能直接使用该发行版中的 GDB 来做远程调试,而要获取 GDB 的源码包。针对 arm 平台作一个简单配置,又一次编译得到对应 GDB 。 GDB 的源码包能够从 http://www.gnu.org/software/gdb/download/ http://ftp.gnu.org/gnu/gdb/ 211.95.105.202 : 3128 能够上去的,全部的版本号都有啊 http: //ftp.cs.pu.edu.tw/linux/sourceware/gdb/releases/ 下载 ftp://ftp.gnu.org/gnu/gdb 外网的 ftp 我常常上不去

使用GDB调试Go语言

生来就可爱ヽ(ⅴ<●) 提交于 2020-03-09 07:23:15
用Go语言已经有一段时间了,总结一下如何用GDB来调试它! ps:网上有很多文章都有描述,但是都不是很全面,这里将那些方法汇总一下 GDB简介 GDB是GNU开源组织发布的⼀一个强⼤大的UNIX下的程序调试⼯工具。或许,各位⽐比较喜欢那种图形界⾯面⽅方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会 发现GDB这个调试⼯工具有⽐比VC、BCB的图形化调试器更强⼤大的功能。所谓“⼨寸有所⻓长,尺有所短”就是这个道理。 目前支持的语言 (GNU gdb (GDB) 7.8) 进入 gdb之后输入 set language 可以查看支持的语言列表 $ gdb (gdb) set language Requires an argument. Valid arguments are auto, local, unknown, ada, c, c++, asm, minimal, d, fortran, objective-c, go, java, modula-2, opencl, pascal. (gdb) 准备工作 首先看下已经编写好的一个简单的go语言程序 ➜ go-debug-example tree . ├── lib │ └── calc.go └── main.go 1 directory, 2 files main.go package main