程序调试

gdb调试段错误及使用

自作多情 提交于 2019-12-25 06:39:18
在编程调试中,经常出现段错误,此时可用gdb调试。具体方法为注册段错误信号处理函数,在处理函数中启动gdb。 具体代码如下: void segv_handler(int no) { char buf[512]; char cmd[512]; FILE *file; snprintf(buf, sizeof(buf), "/proc/%d/cmdline", getpid()); if(!(file = fopen(buf, "r"))) { exit(EXIT_FAILURE); } if(!fgets(buf, sizeof(buf), file)) { eixt(EXIT_FAILURE); } if(buf[strlen(buf) - 1 ] == '\n') { buf[strlen(buf) -1] = '\0'; } snprintf(cmd, sizeof(cmd), "gdb %s %d", buf, getpid()); system(cmd); } 注册函数: signal(SIGSEGV, segv_handler); 下面转自一些总结: 作为一名程序猿,日常开发中解决各种bug是不可避免的。对于简单的bug通过日志分析,或者增加打印信息就能很快定位到原因并解决。但是对于某些比较复杂的情况,想要定位到bug往往十分困难。查阅了很多资料,经过不断尝试

GDB调试器用法

一曲冷凌霜 提交于 2019-12-24 21:43:05
转自: http://21cnbao.blog.51cto.com/109393/223565 gdb调试器用法 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 ,

gcc常用编译选项

☆樱花仙子☆ 提交于 2019-12-24 07:02:18
“-Wall”选项打开所有最常用到的编译警告,强烈建议打开,可以捕捉到许多在C编程中最常发生的错误。 “-o”选项来为可执行文件指定一个不同的输出文件。 “-c”用于把源码文件编译成对象文件。 对象文件包含的是机器码,其中任何对在其他文件中的函数(或变量)的内存地址的引用都留着没有被解析。这样就允许在互相之间不直接引用的情况下编译各个源代码文件。链接器在生成可执行文件时会填写这些还缺少的地址,然后把所有的对象文件组合在一起生成单个的可执行文件。当用“-c”来编译时,编译器会自动生成与源文件同名,但用“.o”来代替原来的扩展名的对象文件。 gcc使用链接器ld来施行链接,它是一个单独的程序。在GNU系统上用到的是GNU的链接器,即GNU ld。 通常,链接要快于编译----在一个有许多源文件的大型项目中,只重新编译那些被修改过的文件可以显著地节省时间。仅仅重编译项目中修改过的文件的过程可以用GNU Make来自动完成。 标准的系统库通常能在“/usr/lib”和“/lib”目录下,C标准库自身存放在“/usr/lib/libc.a”中,包含ANSI/ISO C标准指定的各个函数。其他库都需要显示或隐示指定。 “-lNAME”试图链接标准库目录下的文件名为“libNAME.a”中的对象文件。在大型程序中通常会用到很多“-l”选项,来链接象数学库,图形库和网络库。使用选项“-lNAME

VS2010远程调试环境配置详解

吃可爱长大的小学妹 提交于 2019-12-24 04:58:42
VS2010远程调试环境配置详细讲解: 阅览下文之前,请看相关符号说明: 1. A 代表本地机,即就是研发机 (以下示例为Win764位) 2. B 代表远程机,即就是客户机 (以下示例为WinXp32位) 3. (###) 括号中的内容为命令顺序 【1】具体步骤 (1)在A机上(运行—cmd-ipconfig)获取A机的ipA(ps:记不住就先暂时保存着) (2)从A机上拷贝 C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\Remote Debugger文件夹到B机上(ps:放桌面即可) (3)在B机上连接(运行-cmd-ping + ipA)通A机(ps:必须的条件) (4)在B机上(运行-cmd-ipconfig)获取B机的ipB(ps:记不住就先暂时保存着) (5)在B机上运行文件夹中的应用程序:Remote Debugger\x86\msvsmon.exe(ps:当然我这里按照需求选择的是x86文件夹) 界面打开弹出Visual Studio 远程调试监视器 ,如下图: (6)设置B机的访问权限,同时关闭B机的防火墙。 操作过程如图 首先,打开远程调试监视器的工具栏的选项卡: 其次,设置身份验证模式: 最后,查看设置后的效果信息: (7)通过B机用户取得B机登陆账号与密码(ps

Debug和Release之区别

元气小坏坏 提交于 2019-12-24 04:40:57
关于Debug和Release之本质区别的讨论本文主要包含如下内容: 1. Debug 和 Release 编译方式的本质区别 2. 哪些情况下 Release 版会出错 2. 怎样“调试” Release 版的程序 一、Debug 和 Release 编译方式的本质区别 Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程 序。Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度 上都是最优的,以便用户很好地使用。 Debug 和 Release 的真正秘密,在于一组编译选项。下面列出了分别针对二者的选项 (当然除此之外还有其他一些,如/Fd /Fo,但区别并不重要,通常他们也不会引起 Rele ase 版错误,在此不讨论) Debug 版本: /MDd /MLd 或 /MTd 使用 Debug runtime library(调试版本的运行时刻函数库) /Od 关闭优化开关 /D "_DEBUG" 相当于 #define _DEBUG,打开编译调试代码开关(主要针对 assert函数) /ZI 创建 Edit and continue(编辑继续)数据库,这样在调试过 程中如果修改了源代码不需重新编译 /GZ 可以帮助捕获内存错误 /Gm 打开最小化重链接开关,减少链接时间 Release 版本: /MD /ML 或

RT-Thread USB虚拟串口收发调试

我与影子孤独终老i 提交于 2019-12-24 01:11:19
学习过程中参考博文: 记录——基于 RT-Thread 实现 USB 虚拟串口 但是遇到了两个问题: 1.串口有设备,但是不能发送; 2.串口能发送但不能接收; 第一个问题,是因为rtt的usb虚拟串口默认启用了RTS和DTR(终端准备好接收): static rt_err_t _interface_handler ( ufunction_t func , ureq_t setup ) { struct vcom * data ; RT_ASSERT ( func != RT_NULL ) ; RT_ASSERT ( func -> device != RT_NULL ) ; RT_ASSERT ( setup != RT_NULL ) ; data = ( struct vcom * ) func -> user_data ; switch ( setup -> bRequest ) { case CDC_SEND_ENCAPSULATED_COMMAND : break ; case CDC_GET_ENCAPSULATED_RESPONSE : break ; case CDC_SET_COMM_FEATURE : break ; case CDC_GET_COMM_FEATURE : break ; case CDC_CLEAR_COMM_FEATURE : break ;

NodeJs之调试

风格不统一 提交于 2019-12-23 23:44:24
关于调试 当我们只专注于前端的时候,我们习惯性F12,这会给我们带来安全与舒心的感觉。 但是当我们使用NodeJs来开发后台的时候,我想噩梦来了。 但是也别泰国担心,NodeJs的调试是很不方便!这是肯定的。 但是还好,我们有## node-inspector ##来帮助我们解决一部分的调试问题,但是对于异步能力很强的NodeJs它还是有点力不从心。 node-inspector 安装node-inspector 依旧是通过npm来全局安装node-inspector npm install -g node-inspector 测试代码 //event.js var events = require('events'); var util = require('util'); function tianxiasan(name){ this.name = name; events.EventEmitter.call(this); } util.inherits(Restaurant, events.EventEmitter); //定义角色 var restaurant = new tianxiasan('奕剑'); 这就是我们要调试的代码 启动node-inspector 先启动node-inspector C:\Users\Administrator>node-inspector

adb 命令详解

巧了我就是萌 提交于 2019-12-23 08:46:11
Android 调试桥 (adb) 是一种功能多样的命令行工具,可让您与设备进行通信。adb 命令便于执行各种设备操作(例如安装和调试应用),并提供对 Unix shell(可用来在设备上运行各种命令)的访问权限。它是一种客户端-服务器程序,包括以下三个组件: 客户端 :用于发送命令。客户端在开发计算机上运行。您可以通过发出 adb 命令从命令行终端调用客户端。 守护进程 (adbd) :在设备上运行命令。守护进程在每个设备上作为后台进程运行。 服务器 :管理客户端和守护进程之间的通信。服务器在开发计算机上作为后台进程运行。 adb 包含在 Android SDK 平台工具软件包中。您可以使用 SDK 管理器 下载此软件包,管理器会将此软件包安装在 android_sdk/platform-tools/ 。或者,如果您需要独立的 Android SDK 平台工具软件包,可以 点击此处进行下载 。 要了解如何连接设备以进行 adb 通信,包括如何使用 Connection Assistant 对常见问题进行排查,请参阅 在硬件设备上运行应用 。 adb 的工作原理 当您启动某个 adb 客户端时,客户端会先检查是否有 adb 服务器进程正在运行。如果没有,它将启动服务器进程。服务器在启动后会与本地 TCP 端口 5037 绑定,并监听 adb 客户端发出的命令 - 所有 adb

易语言学习笔记(2)

家住魔仙堡 提交于 2019-12-23 08:30:40
易语言学习笔记(2) 编写一个MP3播放器 windows控制台程序 易语言的命令 学会查找命令 方法型语句 命令型语句 命令表(系统核心支持库) 数值处理命令 判断命令 循环命令 跳转命令 常用命令 编写一个MP3播放器 打开易语言,点击工具栏的快捷按钮【新建】,并在弹框中选择Windows窗口程序,如图所示 在新窗体中画一个编辑框和两个按钮控件。各自选中按钮后,打开属性面板,分别将这两个按钮的标题属性改为“播放MP3”和“停止播放”。 双击标题为【播放MP3】的按钮,自动切换到 _按钮1_被单击 子程序代码区,输入以下代码: 播放MP3(1,编辑框1.内容) ;双击标题为【停止播放】的按钮,自动切换到 _按钮2_被单击 子程序代码区,输入以下代码: 停止播放() ; 菜单中点击【编译】-》【编译】,就可以生成exe文件了。一个简易MP3播放器就完成了。 windows控制台程序 【新建】-》【 windows控制台程序】,在 子程序名 下输入下列示例代码,运行后,在易语言底部的【输出】窗口查看结果。具体示例在下方。 易语言的命令 在 《易语言入门教程(1)》 中,用到了一个 到文本() 命令,类似于 javascript 的 toString() ,这就是 易语言的命令 。 命令是由易语言提供的能够完成某一特定功能的指令,书写格式为: 命令名称 (参数,...... ) 。

java基础 之 Debug

旧巷老猫 提交于 2019-12-23 02:19:40
Debug调试程序 可以让代码逐行执行,查看代码执行的过程,调试程序中出现的Bug。 使用方式 在行号的右边,鼠标单击,添加断点(每个方法的第一行,哪里有bug添加到哪里) 右键选择Debug执行程序 程序就会停留在添加的第一个断点处 执行程序 f8:逐行执行程序 f7:进入到方法中 shift+f8:跳出方法 f9:跳到下一个断点,如果没有下一个断点,就结束程序。 来源: CSDN 作者: IT喳喳喳喳 链接: https://blog.csdn.net/fanjingchen/article/details/103655162