Vim 是几十年来最流行的基于终端的文本编辑器之一。但无论你使用 Vim 多久,总会有更多你不知道的技巧和窍门。这是关于在 Vim 中将缩进宽度设置为 2 个空格或 4 个空格。...在您的 vimrc 文件(位于 ~/.vimrc)中,添加以下行以在 Vim 中自动使用 2 个空格而不是制表符。...设置自动缩进假设您正在编写一行代码并且下一行代码需要缩进,您按 Enter 键转到下一行,但不会自动应用缩进。要自动缩进行,将以下行添加到您的 'vimrc'。...我还建议您对tabstop和使用相同的值shiftwidth。使用不同的值可能会弄乱您的缩进。...结论以上所有内容都适用于新文件,要在 Vim 中将当前打开的文件中的制表符转换为空格,请按 Esc 键进入 Normal 模式。
下面的shell脚本是将/opt下yyyymmdd格式的目录压缩打包为bak_yyyymmdd.zip,并通过ftp上传到192.168.0.2上的bak目录下。 #!
为Linux设置MAC地址 如果不设置MAC地址,单板为自动生成随机地址,DHCP可能分配新的IP地址,导致需要重新使用串口连接单板查看IP地址。...可以在system-user.dtsi加入下列字段,可以为Linux设置固定MAC地址。...&gem0 { local-mac-address = [00 0a 35 00 18 29]; }; 添加dropbear key 如果不添加dropbear key,单板为自动生成dropbear...有些工具会自动保存远端设备的ssh key。后来连接时,如果发现交换的key,和本地key不一样,会拒绝链接。...${sysconfdir}代表linux下的目录/etc。
main设置函数断点 b 9 设置指定行断点 b 将下一行设置为断点 b test if a == 10 设置条件断点 delete 删除断点 d 3 删除指定的断点 condition 修改条件...8 查看指定堆栈帧信息 info frame 查看当前堆栈帧更详细的信息 print a 打印变量信息 print/x a 十六进制输出变量信息 print a + b 可以进行表达式计算 print...显示变量的类型 dump memory 输出文件名 内存起始地址 内存终止地址 restore 文件名 binary 起始位置 watch buf buf的值一旦改变,会触发watchpoint...address on 打开地址输出,当程序显示函数信息时,GDB会显出函数的参数地址。...系统默认为打开的 set print object 在C++中,如果一个对象指针指向其派生类,如果打开这个选项,GDB会自动按照虚方法调用的规则显示输出,如果关闭这个选项的话,GDB
请问在cuda的核函数中可以按地址调用普通变量么?...但需要注意这个问题: (1)最终指向global memory地址空间的指针,可以在本次kernel启动,或者下次kernel启动的任何线程中都是有效的。...如果错误的在本次kernel启动的本block中的其他线程使用,则自动得到被替换成对应的线程的对应local memory位置的值。...另外两点需要注意的: (4)在部分平台支持P2P Access的情况下,则指向一张卡的global memory的指针,可以在另外一张卡上的kernel中被使用,类似情况(1)。...此时这种内存空间上的寻址可以: (1)增强为CPU也能访问他们,哪怕某段时间实质的存储后备介质并非内存(自动page fault + 数据迁移) (2)GPU访问的时候更好的性能,会自动引入可能内存
Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。...也可以简单把 Unity 理解为一个游戏引擎,可以用来专业制作游戏!...---- Unity小知识点学习 层级面板中的 ‘小手指’ 作用: 在Scen中将该物体设置为不可选中状态 在层级面板中有一个小手指一样的图标(我也不知道官方叫啥~) 当我们给物体选上之后,...他就会变成一个禁止的状态,就是上图中Plane物体前面那个样子 正常没选中的时候就是Cube前面那个样子的图标,点一下就会选中!...小手指的作用就是,当我们点了这个小手指,成为一个斜杠似的禁止状态时 在Scene场景中我们就没法通过鼠标来选中这个物体了 ! 演示效果: ----
A、查看栈信息 当程序被停住了,你需要做的第一件事就是查看程序是在哪里停住的。当你的程序调用了一个函数,函数的地址,函数参数,函数内的局部变量都会被压入“栈”(Stack)中。...比如:函数地址,调用函数的地址,被调用函数的地址,目前的函数是由什么样的程序语言写成的、函数参数地址及值、局部变量的地址等等。...这非常方便于程序的调试,可以在程序运行的任意位置设置断点,并在该断点用GDB产生一个信号量,这种精确地在某处产生信号非常有利程序的调试。...也就是说,GDB会根据你所调试的程序的语言,来设置自己的语言环境,并让GDB的命令跟着语言环境的改变而改变。...info frame 查看当前函数的程序语言。 info source 查看当前文件的程序语言。 如果GDB没有检测出当前的程序语言,那么你也可以手动设置当前的程序语言。
GDB是在Linux命令行下对C/C++的程序进行调试常用的一个命令, 现将平时记录在本子上的笔记整理记录一下....,相关命令为: break [函数名,行数或者指令地址] [condi] 在指定地方加上断点 例: (gdb) set $counter = 0 (gdb) break 26 if ++$counter...== 99 在第26行设置断点,每次触发断点的时候执行判断条件,仅在判断条件为真的时候使程序在断点处停止。...frame 是在栈中为参数、返回地址和局部变量保留的一块内存区,必要时在过程调用中使用,相关命令: frame[args]: 从一个栈帧移动到另一个,并打印选择的栈帧。...$ps:程序状态寄存器 $sp:stack pointer栈指针 $fp:frame pointer 指向当前栈帧的指针 三、变更执行 1)修改变量 print i=num,赋值并打印变量i set
访问系统数据区,尤其是往系统保护的内存地址写数据。比如:访问地址为0的地址。 内存越界(数组越界,变量类型不一致等)访问到不属于当前程序的内存区域。...例如在循环体中可以设置break ... if i = 100 来设置循环次数 删除断点 (gdb) clear location:参数 location 通常为某一行代码的行号或者某个具体的函数名。...) until location:参数 location 为某一行代码的行号 查看变量的值 print(p) p num_1:参数 num_1 用来代指要查看或者修改的目标变量或者表达式 它的功能就是在...(gdb) info frame 我们可以查看当前栈帧中存储的信息 该命令会依次打印出当前栈帧的如下信息: 当前栈帧的编号,以及栈帧的地址; 当前栈帧对应函数的存储地址,以及该函数被调用时的代码存储的地址...当前函数的调用者,对应的栈帧的地址; 编写此栈帧所用的编程语言; 函数参数的存储地址以及值; 函数中局部变量的存储地址; 栈帧中存储的寄存器变量,例如指令寄存器(64位环境中用 rip 表示,32为环境中用
作用如下: 让程序按照自己定义的要求运行,不必每次改变程序 让程序在设置的断点处停住,并且检查程序的执行情况 动态改变程序的执行环境 一、启动调试 gdb <program...在gdb中表示寄存器名时前面要加个$,例如p $esp可以打印esp寄存器的值,如esp寄存器的值是0xbff1c3f4,所以x/20 $esp命令查看内存中从0xbff1c3f4地址开始的20个32位数...;set var 设置变量值 7.设置位置断点,设置断点命令b (break的简写) b linenum b function b filename:linenum b filename:function...查看当前运行信息 info b breakpoints 为设置的断点的标号 info args/frame/locals/line filename:function...删除断点可以使用 clear和d(delete的简写) clear删除断点, 使用方法和b命令类似 d [breakpoints] breakpoints 为设置的断点的标号 10.
GDB主要有以下功能: 设置断点 单步调试 查看变量的值 动态改变程序的执行环境 分析崩溃程序产生的core文件 GDB常用命令 命令 简写 含义 file - 装入待调试的可执行文件 run r 执行程序...= 0 - 根据条件设置断点(sum不等于0时,第9行设断点) set varsum=0 - 修改变量的值(使sum变量的值为0) watch - 监视一个变量的值 examine - 查看内存中的地址...可以继续使用info locals命令查看add()函数中的局部变量的值,也可以使用frame 1命令先选择主函数所在的1号帧栈,再使用info locals命令查看主函数中的局部变量的值: (gdb)...如果局部变量默认不是初始化为0,可以在GDB环境下通过set var命令修改变量的值,并查看运行效果。...由于程序在本电脑上运行无误,我们现在故意修改sum的初始值为100,并查看最终的运行结果: (gdb) set var sum=100 No symbol "sum" in current context
break filename:function 在源文件filename的function函数的入口处停住。 break *address 在程序运行的内存地址处停住。...) watch 为表达式(变量)expr设置一个观察点。...(unload为关键字,目前此功能只在HP-UX下有用) 断点设置在函数foo中,断点条件是x>0,如果程序被断住后,也就是,一旦x的值在foo函数中大于0,GDB会自动打印出x的值,并继续运行程序。...比如:frame 0,表示栈顶,frame 1,表示栈的第二层。 up 表示向栈的上面移动n层,可以不打n,表示向上移动一层。...jump 这里的是代码行的内存地址。
问题1: 今天在添加java的环境变量的时候,我在/etc/profile添加了环境变量,因为我使用的是zsh,在source /etc/profile以后,zsh的主题和插件都没有了,java -version...java -version提示没有此命令,懵~ 推测问题原因: 由于在终端中source /etc/profile只是让本shell进程执行,相当于只是在本shell执行了环境变量,所以重启之后依旧失效...推测解决方法: 在~/.zshrc中添加source /etc/profile 重启shell 输入java -version 完美解决!...所以推测还有一种方法,在/etc/zsh/zprofile下面export相应的环境变量. 问题2: 在后面的使用中,发现切换到root用户的时候,java的环境变量又不生效了。...解决办法: 在/root/.bashrc文件尾部添加: source /etc/profile ok,完美解决
(基础类型) N 个属性(attribute), 用于具体描述一个DIE AT_low_pc, AT_high_pc 分别代表函数的 起始/结束 PC地址 AT_frame_base 表达函数的栈帧基址...(frame base) 为寄存器 rbp 的值 AT_name 描述函数的名字为 s_client_main AT_decl_file 说这个函数在 apps/s_client.c 文件中声明 AT_decl_line.../bin/Debug/workbinary -x gdbcommands -x args 3.4. gdb运行相关 3.4.1查看变量 info local(当前函数的局部变量) info b(当前设置的断点...打印 p :打印某个变量名 x/,比如说x/10xb :打印开始的10个地址,以十六进制的单字节输出。...查看当前程序的进程空间地址分布 set env LD_LIBRARY_PATH /data/mariolu/tls13/openssl-OpenSSL_1_1_1/设置当前的运行环境 gdb -tui
让程序停止在你指定的位置:设置断点 3. 在停止点查看当前程序的状态:变量、寄存器的值 4....break +:在往后数offset行设置断点 break -:在往前数offset行设置断点 break *:在指定的虚拟地址上设置断点 break...frame [n]:frame(f)切换帧,n为一个从0开始的数,表示栈中的层次编号,0代表栈顶。...set value=11:设置变量value的值为11 方便变量: 有时候想挨个打印数组的值,如果GDB能提供一个变量作为数组的下标,随着循环的进行变量值也随着变化,这样查看数组元素的值就非常方便了。...修改变量: 上节在设置变量中提到可以通过set命令来设置变量的值,但当你代码中的变量和GDB中的参数名字一样时,需要如下设置。
查看断点列表 break [+-]offset 在当前位置偏移量为[+-]offset处设置断点 break *addr 在地址addr处设置断点 break ... if expr 设置条件断点,仅仅在条件满足时...命令 作用 print &variable 查看变量的内存地址 watch *(type *)address 通过内存地址间接设置断点 watch -l variable 指定location参数 watch...info frame [addr] 描述当前选择的栈帧 info args 当前栈帧的参数列表 info locals 当前栈帧的局部变量 多进程、多线程 多进程 GDB在调试多进程程序(程序含fork...variable的值为xxx set {type}address = xxx 给存储地址为address,类型为type的变量赋值 info frame 显示函数堆栈的信息(堆栈帧地址、指令寄存器的值等...frame 栈帧用来存储函数的变量值等信息,默认情况下,GDB总是位于当前正在执行函数对应栈帧的上下文中。 在前面的例子中,由于当前正在print()函数中执行,GDB位于第0帧的上下文中。
显示指定行号或者指定函数附近的源代码 b break 在指定行号或指定函数开头设置断点 r run 运行程序,直到程序结束或遇到断点 c continue 在程序中断后继续执行程序,直到程序结束或遇到断点停下...如果有函数调用,则进入函数内部 u until 执行到指定行号或指定函数的开头 p print 显示变量或表达式的值 disp display 把一个表达式设置为display,当程序每次停下来时都会显示其值...调用栈由栈帧(Stack Frame)组成,每个栈帧对应着一个未运行完的函数。在GDB中可以用backtrace(简称bt)命令打印所有栈帧信息。...如果要实现真正的交换,我们应该传入的是存储变量的地址,此时函数swap的形参类型应该为指针类型 PS: C语言的变量都是放在内存中的,而内存中间的每一个字节都有一个称为地址(address)的编号。...每一个变量都占有一定数目的字节(可以用sizeof运算符获得),其中第一个字节的地址称为变量的地址。
Linux环境下,当程序异常退出(发生段错误)时,会产生一个core文件,该文件记录了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息等,我们可以理解为是程序工作当前状态存储生成的一个文件...---- 前期设置 设置core文件生成的目录,其中%e表示程序文件名,%p表示进程ID,否则会在程序的当前目录生成dore文件。...会打印出: 栈的层编号 当前的函数名 函数参数值 函数所在文件及行号 函数执行到的语句 info frame/f 可以查看到更详细的当前栈层的信息,只不过,大多数都是运行时的内存地址。...比如:函数地址,被调用函数的地址,目前的函数是由什么样的程序语言写的,函数的参数地址及值,局部变量的地址等。如下图所示。 info args 打印出当前函数的参数名及其值。...info locals 打印出当前函数中所有局部变量及其值。
在test运行前,栈顶指向着main函数的返回地址ret1 2. test函数执行,把桢指针fp1压入栈,并设置新的桢指针 3. ...也就是说,即使不用单链表规律,只要看一下ret2所在函数分配的局部变量空间大小,压入的参数大小,桢指针大小,返回地址ret2的大小,用addr(ret2)加上这个局部变量空间,参数,桢指针大小,返回地址的大小就应该是...那么,同样的,在使用了-fomit-frame-pointer的情况下,上面5步,就会少掉第2步,也就是说,addr( ret1 ) - addr(ret2)= 0x34 + 4(返回地址大小)。...即相邻两个返回地址ret1, ret2, ret1 > ret2, 假设ret2所在的函数分配的局部变量空间为var_size, 在压入ret2前,压入参数的大小为par_size,那么,addr( ret1...在-fomit-frame-pointer编译选项生成的程序里,栈布局有这样的规律: 两个相邻的返回地址ret1,ret2,其中ret1属于函数func1,ret2属于函数func2,且func1调用func2
) 使程序在指定的代码上暂停执行,便于观察 单步执行程序,便于调试 查看程序中变量值的变化 动态改变程序的执行环境 分析崩溃程序产生的core文件 2....常用调试命令参数 调试开始:执行gdb [exefilename],进入gdb调试程序,其中exfilename为要调试的执行文件名,以下命令后括号内为命令的简化使用,比如 run(r),直接输入命令...查看函数的调用栈帧和层级关系 frame(f) #切换函数的栈帧 info(i) #查看函数内部局部变量的数值 finish #结束当前函数,返回到函数调用点 continue(c) #继续执行 print...(p) #打印值及地址 quit(q) #退出gdb break + num(b) #在某行达断点 info + breakpoints #查看当前设置的所有断点 delete + breakpoints...num(d) #删除第num个断点 display #跟踪查看具体的变量值 undisplay #取消跟踪观察变量 watch #被设置观察点的变量发生修改时,打印显示 i watch #显示观察点
领取专属 10元无门槛券
手把手带您无忧上云