性能分析之 GDB 动态修改内存变量值(C/C++)

闲聊 闲聊 1241 人阅读 | 0 人回复

<
文章目录



1、媒介

前文提到了阐发的思绪是从 OS 级别到代码的级别。可是到了代码级别以后呢,大要借需求静态调试代码,之前写了 Java 的使用的代码静态调试东西。
请拜见:

而且之前正在群里也有道要写闭于怎样修正内乱存变量值的。以是那里也便写一下。
后绝写系列文章的思绪也是将我事情中逢获得的机能阐发思绪逐个写出去。
2、GDB 的界说

此次我们去写 GDB 那个东西。去看看民圆怎样界说那个东西的:

  GDB, the GNU Project debugger, allows you to see what is going on `inside’ another program while it executes – or what another program was doing at the moment it crashed.
GDB can do four main kinds of things (plus other things in support of these) to help you catch bugs in the act:
  

  • Start your program, specifying anything that might affect its behavior.
  • Make your program stop on specified conditions.
  • Examine what has happened, when your program has stopped.
  • Change things in your program, so you can experiment with correcting the effects of one bug and go on to learn about another.
    The program being debugged can be written in Ada, C, C++, Objective-C, Pascal (and many other languages). Those programs might be executing on the same machine as GDB (native) or on another machine (remote). GDB can run on most popular UNIX and Microsoft Windows variants.
便是道可让您查察另外一个程序正在运转的时分“内里”皆有些啥。

  • 能够改动程序的举动;
  • 能够停正在特定的处所;
  • 能够定位程序截至时发作了甚么事;
  • 能够静态修正一些工具;
而且它借能撑持多种言语的调试,借能长途调试。
由于本文没有是 GDB 东西的仿单,以是出筹算把每一个命令皆讲一遍,只扣题修正内乱存变量。
出发点那么下,仍是要降天。

3、一个例子

我便随意写了几止C的代码,俭朴到无根底的也能够玩。
145018f2p4h2hcp42oxzsk.png

编译它:
  1. gcc -g test.c -o test
复造代码
我们能够用 gdb 挪用,也能够挑选用 cgdb 挪用。cgdb 便是用去替 代gdb -tui 的,也便是减了面源代码显现的颜色啥的。看一下截图比对便明白了。

145018mogp5jgzy50ngr5o.jpg

右边是 gdb -tui,右侧是 cgdb。费事面的便是 cgdb 借得另拆一下。其他出有甚么差别。
上面我们去调试下。运转一次出有减断面的。

结果以下:
145019grmxa2ms5vjxjnns.png

由于要调试,以是得先明白要调试甚么。

我那小段代码便一个轮回,以是我把断面设置正在第 7 止轮回里

(GDB 断面有多种方法:能够指定止、函数、文件名+止数、class+function、内乱存所在等,借能够减 if else 的语法之类的)以便一会修正内乱存变量。

历程以下:
145019x2z0t0z8t7db0rra.jpg

从上里的结果去看i值的挨印出有 2、3 的值了,被跳过了。

GDB 不单能够调起去程序,也能够间接 attach 到曾经启动的程序中,以是不消担忧程序没有是本人启动的。只需有权限料理它,怎样皆能料理它。

大要有人会道,我底子没有明白要调试甚么,怎样办呢?

睹到如许的成绩我只能道:您借年青,当前日子借少,总会明白滴。
(潜台词便是:要好勤学习我之前写的思绪。)
4、总结

之以是正在机能阐发的系列中写如许的文章,是为了阐明正在机能阐发中,如许的思绪也是正在需要的时分要有的。
前里我不断道有成绩要定位到代码或 SQL 或参数的层里。偶然候即便我们把仓库拿出去了,借会触及到扯皮的工作,好比情况纷歧样招致的成绩征象差别。以是假如有本事的话,我们便再往下走一层,便是把实践的运转数据拿出去,如许便出有甚么可狡辩的了。
我已经正在一个项目中便是呈现了成绩以后,结果开辟的情况不克不及重现,可是消费的情况必定有。当时让一个小伙跟了那个成绩两个礼拜,也出把成绩战对应的开辟工程师阐明利剑。我便教了他那个本事。分分钟天闪开创造利剑哪做错了。
正在机能阐发的项目中,甚么皆有大要逢获得。
期望如今做机能阐发的人能把握愈来愈多的妙技。

免责声明:假如进犯了您的权益,请联络站少,我们会实时删除侵权内乱容,感谢协作!
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,按照目前互联网开放的原则,我们将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,我们一定不会转载。如果我们转载的文章不符合作者的版权声明或者作者不想让我们转载您的文章的话,请发帖留言提供原创证明,我们将积极配合您!
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并自负版权等法律责任。
回复

使用道具 举报

 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则