应用开发
sydyh43
这个作者很懒,什么都没留下…
展开
-
内核态和用户态相关的内存泄漏
应用程序通过系统调用进入内核态代码。假如内核态代码存在内存泄漏,此内存泄漏属于内核态还是用户态?查看内核态和用户态的统计信息。原创 2022-06-03 10:04:39 · 299 阅读 · 1 评论 -
execv替换原程序
待补充原创 2022-06-03 10:01:26 · 101 阅读 · 0 评论 -
虚拟地址找到物理地址
/proc/self/pagemap原创 2022-06-03 09:58:25 · 241 阅读 · 0 评论 -
fork写时复制分析
待补充原创 2022-03-11 11:03:15 · 194 阅读 · 0 评论 -
strip后发布的程序如何gdb调试
1、针对于对存储空间敏感的设备,比方说嵌入式设备,本身存储空间非常有限,时常为了扣几个KB的空间而废寝忘食。因此对外发布应用程序时,都会通过strip命令把相应的debug信息删除,减少程序本身的大小。但是程序出问题时,由于缺少debug信息,很难完成问题的定位。strip strip_symstrip前后的程序对比,少了很多debug信息的section。(readelf -S strip_sym)strip前strip后,包含很多debug信息section被删除,相应的文件大原创 2022-02-25 13:37:48 · 1514 阅读 · 0 评论 -
程序是如何跑起来的?
1、写段小程序,然后用strace命令查看程序运行情况。#include <stdio.h>int mian(){ printf("hello world.\n"); return 0;}strace ./hello从上图可以看出,会先调用execve系统函数对可执行程序进行解析。execve的使用方法见:执行新程序 execve()_杨博东的博客-CSDN博客_execve2、execve系统函数处理流程SYSCALL_DEFINE3(e原创 2022-02-11 11:24:21 · 1605 阅读 · 0 评论 -
两个进程能同时进入内核态嘛
1、当一个进程从用户态进入到内核态的时候,在内核态期间进程进入休眠模式。此时,另外一个进程又从用户态进入内核态,那这个进程能继续往下执行嘛?两个进程此时用的是同一份内核栈嘛?2、验证2.1、构建场景1,两个进程调用同一个接口(open),此接口内核态下进入休眠模式。int dyh_test_open(struct inode *node, struct file *filp){ int *p = NULL; p = (int *)current_thread_info(); pri原创 2022-02-07 17:54:31 · 708 阅读 · 0 评论 -
用户态与内核态之间的切换
1、用户态与内核态之间通过系统调用接口完成交流,系统调用接口的所有种类:syscalls.h - include/linux/syscalls.h - Linux source code (v5.16.3) - Bootlin当执行程序的时候可以通过strace命令查看程序具体使用了哪些系统调用接口。strace工具_sydyh43的博客-CSDN博客_strace工具2、用户态与内核态之间的切换2.1、用户态进入到内核态2.2、内核态返回到用户态...原创 2022-01-29 20:15:40 · 1414 阅读 · 0 评论 -
用户态的内存泄漏定位,函数重载
1、函数重载的方法如何实现函数打桩_sydyh43的博客-CSDN博客2、具体实现代码工程中,申请和释放内存是通过malloc和free实现的。接下来的工作就是对malloc和free两个函数实现重载。在malloc重载函数中创建一个文件,文件名由malloc返回的地址命名,文件中保存调用malloc重载函数的地址。在free重载函数中删除以释放地址命名的文件。运行一段时间后,查看剩余的文件,剩余文件就是可能出现内存泄漏的地址,通过保存在文件中的数据确认调用malloc的地方。2.1、mal原创 2022-01-19 18:52:26 · 309 阅读 · 0 评论 -
死锁问题----打印此刻系统中所有的task
一、task_struct的遍历进程,线程和内核线程的基本属性都是由struct task_struct结构体定义的。设备上运行的所有task都是通过双链表连成一串,其中第一个task就是init_task,最终又指向会init_task。因此可以通过首个task(init_task)通过双向链表(tasks)遍历所有task,最终回到init_task方式遍历所有的task。 首进程init_task在内核启动的时候静态赋值创建。(/in...原创 2021-08-28 22:39:49 · 357 阅读 · 0 评论 -
用户态的内存泄漏定位,memwatch的使用
一、memwatch源码下载https://www.linkdata.se/sourcecode/memwatch/二、分析内存泄漏1、构造内存泄漏https://blog.csdn.net/sydyh43/article/details/1194856912、把目录中的memwatch.h和memwatch.c拷贝到工程目录下2.1、main函数中添加#include "memwatch.h"2.2、编译脚本中添加-DMEMWATCH -DM_STDIO宏参数gcc ma原创 2021-08-20 21:23:36 · 396 阅读 · 0 评论 -
如何打印堆栈
一、打印堆栈可以方便问题定位,找到具体的函数调用流程。二、打印堆栈的方法2.1、用户态#include <stdio.h>#include <stdlib.h> #include <stddef.h> #include <execinfo.h> #define DUMP_DEPTH 20void dump(void) { int i = 0; size_t size = 0; char **strings = N原创 2021-08-14 22:19:12 · 4597 阅读 · 0 评论 -
用户态的内存泄漏定位,systemtap的使用
一、回顾https://blog.csdn.net/sydyh43/article/details/119487171使用以上的方法定位内存泄漏时,在最后解析堆栈的时候比较麻烦。可以使用systemTap工具提升一下二、构建内存泄漏https://blog.csdn.net/sydyh43/article/details/119485691三、systemTap的安装PC端https://blog.csdn.net/sydyh43/article/details/11928183原创 2021-08-07 17:09:27 · 579 阅读 · 1 评论 -
用户态的内存泄漏定位,mtrace的使用
一、构建内存泄漏https://blog.csdn.net/sydyh43/article/details/119485691二、在main函数上添加mtrace,muntrace函数及头文件#include <unistd.h>#include <stdio.h>#include <mcheck.h> //添加extern void *mall_c();extern void *mall_c_free();extern void *mall_原创 2021-08-07 15:51:40 · 545 阅读 · 0 评论 -
串口的应用层操作
一、设备中一般会用第二串口与外设通信。需要可以配置波特率,实现应用层面的串口读写。二、代码实现#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <fcntl.h>#include <signal.h>#include <sys/ioctl.h>#include <termios.h>#include <string.h&g原创 2021-07-03 21:30:27 · 216 阅读 · 0 评论 -
sleep睡眠时间的疑问
一、内核配置的tick频率menuconfig Kernel Features Timer frequencymenuconfig原创 2021-06-10 17:24:42 · 449 阅读 · 0 评论