陌上花开缓缓归以
无
展开
-
反汇编命令学习以及分析越界和空指针问题
1184: 48 8d 3d 79 0e 00 00 lea 0xe79(%rip),%rdi //加载格式字符串的地址到rdi寄存器# 2004 118b: b8 00 00 00 00 mov $0x0,%eax //清除eax寄存器,因为printf的返回值将存储在这里。1160: c3 retq //返回到调用者,eax寄存器包含返回值。原创 2024-11-09 16:14:03 · 620 阅读 · 0 评论 -
valgrind 分析死锁
【1】里面的1 表示owner,从上面的打印可以看到mutex 2和 3和owner形成了相互等待的过程,所以造成了死锁。运行后死锁后ctrl+c发送退出信号退出进程。2,代码pthread.c。原创 2024-11-05 11:38:46 · 197 阅读 · 0 评论 -
ASAN ThreadSanitizer定位多线程(资源管理)
ThreadSanitizer又叫TSan,是一个检查线程Data Race的C/C++工具。上面的代码在不加锁的情况下,两个线程同时去修改Global变量,从而导致Data Race。这个时ubuntu20.04上面的问题,22.04后面应该没这个问题。1,环境部署参考上一篇文章。2,多线程资源互斥示例代码。,错误信息会直接输出出来。代码举例pthread.c。也可以gdb分析 .原创 2024-11-04 09:50:55 · 431 阅读 · 0 评论 -
ASAN Sanitizer使用之定位(内存)
fsanitize-recover=address:一般后台程序为保证稳定性,不能遇到错误就简单退出,而是继续运行,采用该选项支持内存出错之后程序继续运行,需要叠加设置ASAN_OPTIONS=halt_on_error=0才会生效;里面的打印heap-buffer-overflow (/home/lark/test/a.out+0x1261) in funcShadow bytes around the buggy address: 可以看出有访问内存堆溢出(0xfa)。五,栈内存回收后使用。原创 2024-11-04 09:49:43 · 308 阅读 · 0 评论 -
cpu过高问题定位
查看堆栈我们可以看出是轮询光模块的自适应接口的link状态时过高,我们看此任务的实时轮询时间是1s,而看代码发现访问iic有大量反错容错机制,一直在校正数据,所以一直在循环占用cpu资源,所以更改此处的逻辑后更新版本后再看cpu占用正常了,今天的问题定位问题就到这里了。我们可以看到是进程里面的Timer_halPortL定时器线程cpu比较高,然后我们需要看是线程里面的那个函数cpu占用率比较高。(2)查看cpu占用率过高的线程:top -H -p pid。(1)查看cpu占用率过高的进程:top。原创 2024-08-09 14:32:37 · 350 阅读 · 0 评论 -
makefile总结
.o只能匹配当前目录下的.o文件,因为它是用于make命令中的通配符,用于表示规则中的通配符,如%.o可以匹配所有以.o为后缀的文件名,但是只能匹配当前目录下的文件。的目标是“ foo.a(bar.o)”,那么,“ $%” 的值就为“ bar.o”,“ $@”的值为“ foo.a”。而*.o则可以匹配系统中所有.o文件,因为它是Shell中的通配符,可以匹配所有符合条件的文件,不限于当前目录。例如:文件“ dir/a.foo.b”,当目标的模式为“ a.%.b”时,“茎”是目标模式中“ %”所代表的。原创 2024-07-03 20:09:02 · 364 阅读 · 0 评论 -
objdump反汇编定位程序挂死
2,加入源代码 -S。原创 2024-07-03 20:08:17 · 119 阅读 · 0 评论 -
信号捕捉生成gcore定位程序挂死
文件exception.txt。原创 2024-04-30 16:10:37 · 222 阅读 · 0 评论 -
addr2line跟踪core
1,动态库如何指定链接路径,不适用/usr/bin,使用 -L . -lfun -Wl,-rpath=.偏移地址= 0xb76f0437 - 0xb76f0000 = 0x437。3,addr2line怎么找动态库的偏移地址,0x437怎么来的。a,挂死地址:0xb76f0437(是物理地址还是虚拟地址)先找到libfun.so的起始地址:0xb76f0000。2,addrline 没看到打印,输出?当把fun.c编译成动态库时呢。第一步,运行所有.c。原创 2024-04-30 16:08:38 · 289 阅读 · 0 评论 -
linux i2c-tools使用总结
5,i2c detect -y iic-num(iic-num为上面的iic-bus序列号)1,安装ic-tools。2,查看有几条iic总线。4,iic-help命令。原创 2024-03-27 11:26:00 · 473 阅读 · 0 评论 -
重启原因总结
3,系统重启过程中我们需要对芯片做什么处理,不同情况下对芯片是否做相同的处理呢。(4)power reboot(电源重启(掉电重启))(3)watchdog reboot(看门狗重启)(1)cold reboot (冷重启)(2)warm reboot(暖重启)什么是热重启,什么是冷重启,有什么区别。(3)什么是看门狗重启。(4)什么是掉电重启。原创 2023-10-22 11:49:03 · 924 阅读 · 0 评论 -
linux gdb 跟踪socket 文件读写和其数据间的传递
功能:首先在客户端实现文件的写入,写入一个结构体,在服务器端需要接受(即读出结构体打印),而后在服务器端接受到结构体后(读出),而后将读出的结构体写入套接字。调试技巧:gdb跟踪代码调试:代码服务器端server_gdb.c#include <sys/types.h>#include <sys/socket.h>#include <stdio.h&g...原创 2019-08-31 21:44:34 · 992 阅读 · 3 评论 -
gdb 跟踪调式core
编译:使用gdb调试core文件来查找程序中出现段错误的位置时,要注意的是可执行程序在编译的时候需要加上-g编译命令选项。原创 2023-04-11 11:50:46 · 2570 阅读 · 0 评论 -
linux udp bind 返回值-1分析(端口被占用)
在linux socket通信中,我们通常用到open/bind/read/write等内部函数,那么当这些函数返回值为-1的时候,我们怎么进一步定位呢!(1)怎么打印出返回值出错的原因呢!strerror头文件。原创 2023-04-06 16:27:27 · 1858 阅读 · 0 评论 -
死锁问题如何定位
thread 命令切换到等待锁(这里主要指Mutex,暂不考虑读写锁)的某个线程。Owner 字段表示是哪个线程持有这把锁,它是线程的 LWP 号,可以通过 info thr 查看。bt 查看, frame(f)切到相应的栈(函数调用的第几层)。查看到thread 33 上面有_lll_lock_wait。2, info thread 查看在那个线程卡住。1) gdb attach 到死锁的进程.info thread 查看在那个线程卡住。1,gdb attach 到死锁的进程.原创 2023-03-14 15:43:21 · 201 阅读 · 0 评论 -
编译原理(gcc,makefile)
最初是作为C语言的编译器(GNU C Compiler),现在已经支持多种语言了,如C、C++、Java、Pascal、Ada、COBOL语言等。命令(COMMAND)是make执行的动作(命令是shell命令或是可在shell下执行的程序)。目标也可以是要执行的动作,如clean,也称为伪目标。1、一个与共享库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码。在使用C语言和其他语言进行程序设计的时候,我们需要头文件来提供对常数的定义和对系统及库函数调用的声明。原创 2022-11-13 11:16:04 · 482 阅读 · 0 评论 -
代码跟踪调式方法
1,我们很多时候被函数的调用关系弄得头晕,这里gdb,sourceinsight 给出了方面gdb bt原创 2021-11-27 16:01:16 · 293 阅读 · 0 评论 -
调试方法总结之gdb跟踪
1,当我们发现我们预想的值和实际的数值不一样时,这个时候应该怎么办呢!首先我们需要确认是否调到了这个接口,如果掉到了这个预期结果的接口,那么说明可能在我们达到了预定结果之后结果又被其他函数给改变了,这个时候我们就需要确定那些接口调用了该函数,可以用sourceinsight查看改变这个变量的地方,一一跟踪可以查到哪里改变了这个数据,然后再分析为什么数据会发生改变。...原创 2021-09-06 15:02:31 · 736 阅读 · 0 评论 -
死锁如何定位
在程序中我们通常用到锁机制,但是我们有时候无意之中可能地方存在思索,那么我们如何快速的定位到思索的位置呢?首先第一次问题出现在我们眼前,什么时候我们想到时死锁问题导致的现象呢!其实死锁的现象很明显,就是系统启动正常,但是应用程序卡死,这个时候大概率就是死锁了,如果系统挂死,这个时候就是系统或者硬件出现问题了,这个时候我们就应该用串口查看打印,看看该死在哪里,我们今天先不说这种情况,我们今天只看应用程序挂死的情况,说会之前的那一句,程序卡死一定是有地方有互斥锁没有释放,我们先来看看下面这个简单的例子:原创 2021-09-20 12:23:03 · 592 阅读 · 0 评论 -
cpu过高定位方法
1,当我们在开发过程中疯狂的写寄存器时,cpu会疯狂上涨,那么我们怎么定位是哪个函数导致的cpu过高呢首先我们用top来看占用cpu情况:其次我们来看那个进程占cpu最高:top -H -p pid(这里就是542)...原创 2019-12-30 20:42:13 · 482 阅读 · 0 评论 -
调试手段-加全局打印-gdb也更好的跟踪变量
1,我们在用gdb跟踪程序的时候,发现有些变量不是很好的跟踪调试,这个时候加全局变量可以更好的用gdb跟踪,而且我们在最开始写代码调试的时候用gdb调试,但是我们在代码进入集成和终试的时候再用gdb就不合适了,这个时候我们需要打印每个接口函数里面的数值,这样的话我们用打印开关或者打印函数来辅助我们来查找问题,所以我们定位我们的问题的时候要分情况,开发初期我们用gdb作为主要手段,打印作为辅助手段,...原创 2019-11-10 12:48:20 · 561 阅读 · 0 评论 -
任务超时怎么定位
1,我们在开发过程中很多时候需要轮询调用一个函数,我们在vxworkx里面将这一操作称之为任务,而在项目中我们又将任务分为3种,low_gather,high_gather,real_gather:而low_gather则是50ms轮询一次(即是10tick,1tick = 5ms),而high_gather和real_gather则是5ms轮询一次(1tick),这就引出了我今天需要写的问题,任务超时。typedef int (*test_fun)(void) TEST_FUN;TEST.原创 2021-02-07 22:21:05 · 435 阅读 · 0 评论 -
Linux 打印调试技巧
1,函数打印调用次数的控制在循环中打印次数的控制举例说明:#include<stdio.h>int g_print_num = 0;int main(){ while(1) { if(g_print_num++ < 10) { printf("g__print_num print\n"); } else { ...原创 2019-12-30 19:47:45 · 564 阅读 · 0 评论 -
代码框架调试技巧
1,硬件跑不起来了,应用软件的进程起不来了,此时就需要用串口来看;2,硬件初始化成功,但是应用软件跑到中间某个地方挂了,这个时候我们可以用gdb单步跟踪,(1)主函数的初始化入口函数开始,单步跟踪,范围从里到外来定位举例说明:#include<stdio.h>int fun(){ return -1;}int fun_fourth(){ int ret = fun(); if(ret < 0) {原创 2021-06-28 19:29:32 · 135 阅读 · 0 评论 -
项目开发的过程总结
我们在公司是怎么开发的呢!1,项目需求:项目组开会定方案。2,项目开发主干上开发吗!对于人多的项目来说,最好在分支上开发,最后合并到主干。最好拉分支。在分支上开发,最后合并到trunk主干上。3,特性测试功能测试:测试报告:4,集成测试(定位问题,和其他功能模块交互)(1)测试人员测试:过每一个功能项。5,迭代版本测试:(1)迭代版本1(2)迭代版本26,封版本:起一个流程ecn。...原创 2021-04-20 21:08:22 · 604 阅读 · 0 评论 -
fpga的学习和调试技巧
1,在学习fpga之前,我们先来学习一下对数据的基本操作,包括数据的左移,右移,以及数据的与或非和异或。(1)数据的左移unsigned int a = 0x16; // 0B00010110unsigned int b = a << 2;//0B01011000printf(" b = 0x%x\n",b);//0x58(2)数据的右移unsigned int a = 0x16;//0B00010110unsigned int b = a >> 2;//原创 2021-04-01 22:48:08 · 580 阅读 · 0 评论 -
开发过程中如何定位问题
在开发过程中,我们经常会遇到各种各样的问题,那么我们一般是怎么定位问题的呢!今天在这里我就做一个小小的总结。1,因为在项目中涉及到各个模块之间的配合开发,而且很多时候我们使用的是别人提供的外链,所以第一步我们先要确定外链是否使用正确,这个一般看svn外链路径或者git外链路径即可,查看外链路径正确之后我们需要考虑到各个模块之间代码的合并,那么我们首先需要确定版本合进去了,这样我们首先查看版本号,而且我们需要在自己的代码模块中加入版本打印函数。****************************原创 2021-04-01 21:05:17 · 562 阅读 · 0 评论 -
linux svn外链学习
很多时候我们申请权限成功时但是没下载权限时,我们可以在svn里面的settins->saving data里面clear这些数据,然后重新登录。1,svn怎么样更改外链路径!找到一个路径下面能够打开如图所示的选项:首先打开TortoiseSVN->properties,我们可以看到下面的界面(最好多个子目录尝试) 然后找到打开Edit,在此界面我们可以删除外链,也可以更改外链映射路径。记住改完之后保存,一直ok之后,最后要提交...原创 2020-12-16 23:08:02 · 647 阅读 · 0 评论 -
gdb跟踪段错误_ 如何产生core_dump文件
,在调试过程中我们如果遇到段错误的时候,我们有时候会很懵逼,这个时候我们怎么去定位呢!这里我把我调试的经验写在这里,供自己以后运到问题时可以参考:程序跑着跑着段错误:这个时候除了分析代码用的最多的就是gdb了,而只用gdb有时候只能看到段错误,不能精确的看到到底是在那段代码中出了问题,所以这个时候就得依赖core_dump了,那么如何产生core_dump和用gdb呢! 先gcc main.c -g (linux 下加-g就可以用gdb了), gdb a.out 进入, b main 打断点 r 运原创 2020-12-11 16:07:23 · 355 阅读 · 0 评论 -
使用GDB调试时attach ID不允许的操作
gdb attach PID出错:不允许的操作(1)挂起程序:gcc 2_threadLock.c.c -lpthread -g -o 2_threadLockps -aux|grep 2_threadLock 查看pidps -aL 查看线程id号pstree -p pid(此处的pid是上面输出的pid)出错后,按下面做法做即可:sudo vim /etc/sysctl....原创 2019-04-17 23:38:13 · 1637 阅读 · 3 评论 -
linux gdb调试总结(常用调试命令)
linux gdb单函数调试gcc test.c -g 运行函数gdb a.outgdb -q a.out (可以不用看到打印出来的消息)1,l(list)看自己的代码,默认一次显示10行q :退出调试2,shell clear:清屏3,r(run) 运行4,info terminal 用于显示程序用到的终端的模式info registers (查看除了浮点寄存器以外的寄存器)...原创 2021-06-05 18:56:12 · 858 阅读 · 0 评论 -
常见的内存错误及其对策
1,常见错误及其处理策略:(1) 内存分配未成功,却使用了它。编程新手常犯这种错误,因为他们没有意识到内存分配会不成功。常用解决办法是,在使用内存之前检查指针是否为NULL。如果指针p是函数的参数,那么在函数的入口处用assert(p!=NULL)进行检查。如果是用malloc或new来申请内存,应该用if(p==NULL) 或if(p!=NULL)进行防错处理。(2) 内存分配虽然成功,...原创 2019-04-09 15:45:44 · 292 阅读 · 0 评论 -
gdb free invalid pointer问题解决
1,代码问题:新建 gdb.c#include<stdio.h>#include<stdint.h>#include<stdlib.h>//#include <sharemem.h>void fun(uint8_t* p){ uint8_t a = 100; *p = a;}void fun1(int* p)...原创 2019-07-28 09:58:38 · 4515 阅读 · 0 评论 -
gdb 跟踪指针(malloc)
1,我们在使用参数传递的时候#include<stdio.h>#include<stdlib.h>#include<assert.h>char* add(int a){ switch(a) { case 0: return "zero"; break; case 1: retur...原创 2019-10-26 00:25:17 · 1523 阅读 · 0 评论 -
stack smashing detected 栈溢出小结
1,代码实现:#include<stdio.h>#include<stdint.h>#define LASER_FAIL 0#define LASER_OK 1uint32_t fhapp_laser_logic_on(){ uint32_t p_data = 1; return p_data;}uint8_t fhapp_laser_on...原创 2019-07-29 23:02:02 · 3063 阅读 · 0 评论 -
gdb call跟踪函数
1,在开发过程中我们需要传递各种数据,因此需要调用别人的接口,那么我们如何确我们调用到了别人的函数,调用别人函数的时候,我们怎么样判断获取的数据是否正确呢,除了前面博客中写到的加入全局变量后加打印,我们还可以使用最直接的方法用gdb中的call命令来实现调用,来判断我们读取的数据是否正确,现在我举一个我在项目中的调用实现过程:从上面的例子我们可以看出:使用call 设置数据和获取数据,获...原创 2019-12-09 21:04:58 · 4390 阅读 · 0 评论 -
Linux mtrace调试内存泄漏
本文只介绍一个实用的linux小命令:mtrace(memory trace), 它能够用来协助定位内存泄露Linux下测试代码:4_trace.c#include <stdio.h>#include<stdlib.h>int main(){ setenv("FREE_TRACE", "taoge.log", "1"); ...原创 2019-04-18 22:09:49 · 357 阅读 · 0 评论 -
Linux memwatch 的使用
下载代码:http://www.linkdata.se/sourcecode/memwatch/下载代码后解压得到如下文件mamwatch.c和memwatch.h是不用动的,我们需要改的是test.c第一步,在test.c加入头文件 #include"memwatch.h"其次编写自己的代码:我的代码如下:#include <stdio.h>#in...原创 2019-04-18 22:53:24 · 671 阅读 · 0 评论 -
Linux 下面Valgrind跟踪内存泄漏
在写大型C/C++工程时难免会发生内存泄漏现象,系统编程中一个重要的方面就是有效地处理与内存相关的问题。你的工作越接近系统,你就需要面对越多的内存问题。有时这些问题非常琐碎,而更多时候它会演变成一个调试内存问题的恶梦。 常见的内存问题一共七种:1. 动态内存泄露;2. 资源泄露,比如文件指针不关闭;3. 动态内存越界;4.数组内存越界;5.动态内存double free;6.使用野指针,即未...原创 2019-04-19 00:48:20 · 562 阅读 · 0 评论 -
Linux 宏定义debug调试
1,宏定义:#include <stdio.h>#include <stdarg.h>#define BUFFER_SIZE 1024#define DEBUG_LEVEL 4typedef enum{ DEBUG_LEVEL_ERROR=0, DEBUG_LEVEL_WARNING, DEBUG_LEVEL_NOTICE...原创 2019-04-29 22:47:31 · 1290 阅读 · 0 评论