![](https://img-blog.csdnimg.cn/20210625130839585.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
debug和调优
debug
infralan
Major in:linux内核 虚拟化 云原生,熟悉:分布式、网络、存储,感兴趣:计算、数据库、机器学习系统。
展开
-
nasm demo
nasm demo使用sys_write的hello.asmsection .data msg db "Hello world!",10 ; 10 is the ASCII code for a new line (LF)section .text global _start_start: mov rax, 1 mov rdi, 1 mov rsi, msg mov rdx, 13 syscall mov rax原创 2021-07-26 15:33:58 · 139 阅读 · 0 评论 -
nasm初步使用
nasm初步使用这篇文章介绍了如何使用nasm开始你的汇编之路,测试平台Ubuntu 18.04。世界上大概没有比写汇编语言更机械性的工作了,如果有,那大概是在期末考试中默写它们。汇编器汇编器是将汇编语言转化为机器码的程序。或许你会以为汇编转化到机器码没什么大不了的,毕竟几乎是一对一的转换。但nasm存在的意义在于它可以很好的适应多种处理器平台,让编写汇编这件事都变得可移植了。nasm可以在Ubuntu下汇编,使用elf32或者elf64格式(具体取决于你的机器,下同)。在不同的机器下写汇编的影响原创 2021-07-26 15:22:22 · 4148 阅读 · 0 评论 -
除法指令demo
除法指令demofpe#include <cstdio>int main(){ int a = 0x80000000; int b = -1; int c = a / b; printf("%d\n", c);}Linux下运行出现Floating point exception (core dumped)查看汇编(gdb) disas mainDump of assembler code for function main(): 0原创 2021-07-26 15:31:00 · 199 阅读 · 0 评论 -
IA-32函数调用栈帧
IA-32函数调用栈帧//hello.cint add(int x,int y){ return x+y;}int main(void){ int s=11; int b=23; int c=add(b,s); return 0;}反汇编代码m@ubuntu:~$ gcc -S -m32 hello.c -o hello.s -fno-asynchronous-unwind-tablesm@ubuntu:~$ cat hello.s .file原创 2021-07-25 11:08:41 · 251 阅读 · 0 评论 -
基本汇编指令详解
基本汇编指令详解常见寄存器寄存器16位32位64位累加寄存器AXEAXRAX基址寄存器BXEBXRBX计数寄存器CXECXRCX数据寄存器DXEDXRDX堆栈基指针BPEBPRBP变址寄存器SIESIRSI堆栈顶指针SPESPRSP指令寄存器IPEIPRIP汇编指令movmovb(8位),movw(16位),movl(32位),movq(64位)寄存器寻址:movl %eax,%e原创 2021-07-25 10:37:49 · 1219 阅读 · 0 评论 -
IA32程序栈帧
IA32程序栈帧(调用者的栈帧)...参数列表返回地址(被调用者的栈帧)---%ebp旧的%ebp保存的寄存器的值局部变量参数列表---%esp当前栈帧也就是被调用者的栈帧,从栈底到栈顶如下构成旧的帧指针(帧指针一般指本栈的栈底,用ebp表示),也就是前一栈帧的ebp指针,它指向前一帧的栈底。保存的寄存器上下文(如果有),因为调用函数寄存器可能有内容,要保存下来,也就是保存在栈上,返回的时候再从栈pop到原来的寄存器。局部变量,即在函数内声明的变量创建的参数列表就是调原创 2021-07-25 00:22:19 · 313 阅读 · 0 评论 -
栈帧push的汇编解释
栈帧push的汇编解释下面是常见的反汇编代码push %rbpmov %rsp,%rbppush %rbxsub $0x18,%rsppop %rbxpop %rbpretq push %rbp是把%rbp寄存器的值保存到内存里面的数组模拟栈,结合下面的mov %rsp,%rbp可以知道,%rbp此刻pysg的就是上面一个栈帧的栈低位置,同时mov也将本初始化为0长度的栈帧低保存起来,因为此刻rsp是上一个栈帧的栈顶位置,刚好就是我的栈底位置。所以m原创 2021-07-25 00:00:53 · 4775 阅读 · 4 评论 -
引用了其他文件的函数
引用了其他文件的函数不需要互相包含头文件,只需要用gcc把两个.o文件合起来就行了。在直接用gcc 1.c单独编译时,可能报错(.text+0x20):对‘main’未定义的引用/tmp/ccypvKJN.o:在函数‘steup’中:clnt_func.c:(.text+0x30):对‘make_dgram_client_socket’未定义的引用clnt_func.c:(.text+0x90):对‘make_internet_address’未定义的引用collect2: error: ld原创 2021-07-01 11:38:56 · 106 阅读 · 0 评论 -
和数组有关的RE问题
和数组有关的RE问题可以用传递数组元素个数的方法解决即:用两个实参,一个是数组名,一个是数组的长度。runtime error (运行时错误)就是程序运行到一半,程序就崩溃了。比如说:除以零数组越界:int a[3]; a[10000000]=10指针越界:int * p; p=(int *)malloc(5 * sizeof(int)); *(p+1000000)=10使用已经释放的空间:int * p; p=(int *)malloc(5 * sizeof(int));原创 2021-07-01 11:36:05 · 258 阅读 · 0 评论 -
main参数原型错误
如下代码片段,int main(int argc, char* argv){ ... if((fpin = fopen(argv[1],"r")) == NULL){ perror("fopen"); exit(1); } ...}可以发现,本来是char ** argv却少写了一个*。带来的后果是,运行程序./a.out 11.c报错fopen: Bad address以为是fopen的问题原创 2021-07-01 11:32:50 · 330 阅读 · 0 评论 -
gcc详解
GCC笔记The History of GCC1984年,Richard Stallman发起了自由软件运动,GNU (Gnu’s Not Unix)项目应运而生,3年后,最初版的GCC横空出世,成为第一款可移植、可优化、支持ANSI C的开源C编译器。GCC最初的全名是GNU C Compiler,之后,随着GCC支持的语言越来越多,它的名称变成了GNU CompilerCollection。这里介绍的gcc是GCC的前端,C编译器.警告信息-Wall : 显示所有常用的编译警告信息。-原创 2021-06-29 21:42:22 · 1094 阅读 · 0 评论 -
gprof官方文档注解
https://www.systutorials.com/docs/linux/man/1-gprof/DESCRIPTIONgmon.out存储了函数调用信息,被调用函数计入调用函数的时间,cc是c complier,-pg会将生成profile的相应版本的库链接进来。Gprof所做的工作就是将目标文件的符号表和函数调用统计信息关联起来,如果有多个则汇总。所以在生成报告的时候需要将二进制文件和gmon.out一起传给gprof,而且由于是编译器插入额外的代码(插桩)进行统计,所以一定要运行起来之后才原创 2021-06-25 16:21:55 · 120 阅读 · 0 评论 -
正确地编译包含自写头文件的cpp 2
当前目录是./剑指offer/测试demo 也就是是说我的文件18.cpp处在“测试demo”这个文件夹里面。18.cpp包含一个头文件List.h,#include<List.h> /*我们这里用的是<>类型的自定义头文件,这是为了用g++ 的-I参数(include),即定义寻找头文件的路径。也可以用#include "list.h",这里不予讨论。*/...原创 2020-01-10 21:19:25 · 245 阅读 · 0 评论