作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有一种方法可以中断正在释放的变量/内存地址吗?一个简单的观察点是否适用于这种情况?
场景,当程序释放变量时出现段错误,显然有问题的变量被释放了两次,我需要知道它第一次被释放的位置。
PS:lldb 和 gdb,如果可能的话,分别用于这两个命令。
最佳答案
gdb
中做到这一点在gdb
你可以通过写 break <em>location</em> if <em>condition</em>
来设置条件断点 .
这意味着为了打破free
在使用指向一些动态分配数据的指针调用函数的地方,我们首先必须获取动态分配数据的地址,然后设置具有合适条件的断点。
进一步阅读:
/tmp% cat > foo.c <<EOF
> #include <stdlib.h>
>
> void some_function (int * p) {
> free (p);
> }
>
> int main () {
> int * p = malloc (sizeof (int));
>
> some_function (p);
>
> free (p);
>
> return 0;
> }
> EOF
/tmp% gcc -g foo.c -o a.out
/tmp% <b>gdb ./a.out</b>
我们需要做的第一件事是找到一个合适的断点,这样我们就可以期待我们想要观察的变量的内容,更具体地说是动态分配内存的地址。
(gdb) <b>list main</b>
2
3 void some_function (int * p) {
4 free (p);
5 }
6
7 int main () {
8 int * p = malloc (sizeof (int));
9
10 some_function (p);
11
然后我们将在合适的地方设置一个断点,在本例中是行 9
— 然后我们运行应用程序以查看 p
中存储的值是什么是。
(gdb) <b>break 9</b>
Breakpoint 1 at 0x400577: file foo.c, line 9.
(gdb) <b>run</b>
Starting program: /tmp/a.out
Breakpoint 1, main () at foo.c:10
(gdb) <b>print p</b>
$1 = (int *) 0x601010
当我们知道我们想要根据 free
监控的地址时,我们可以轻松地在所需位置设置条件断点。首先我们需要确保 free
实际上是按照我们的想法命名的。
(gdb) <b>disas main</b>
Dump of assembler code for function main:
0x0000000000400561 : push %rbp
0x0000000000400562 : mov %rsp,%rbp
0x0000000000400565 : sub $0x10,%rsp
0x0000000000400569 : mov $0x4,%edi
0x000000000040056e : callq 0x400440 <malloc@plt>
0x0000000000400573 : mov %rax,-0x8(%rbp)
=> 0x0000000000400577 : mov -0x8(%rbp),%rax
0x000000000040057b : mov %rax,%rdi
0x000000000040057e : callq 0x400546 <some_function>
0x0000000000400583 : mov -0x8(%rbp),%rax
0x0000000000400587 : mov %rax,%rdi
<em>0x000000000040058a : callq 0x400410 <free@plt></em>
0x000000000040058f : mov $0x0,%eax
0x0000000000400594 : leaveq
0x0000000000400595 : retq
我们现在可以创建断点,并继续执行以查看释放数据的位置:
(gdb) <b>break free@plt if $rdi == 0x601010</b>
Breakpoint 2 at 0x400410 (3 locations)
(gdb) <b>cont</b>
Continuing.
Breakpoint 2, 0x0000000000400410 in free@plt ()
(gdb) <b>backtrace</b>
#0 0x0000000000400410 in free@plt ()
#1 0x000000000040055e in some_function (p=0x601010) at foo.c:4
#2 0x0000000000400583 in main () at foo.c:10
(gdb) cont
Continuing.
Breakpoint 2, 0x0000000000400410 in free@plt ()
(gdb) <b>backtrace</b>
#0 0x0000000000400410 in free@plt ()
#1 0x000000000040058f in main () at foo.c:12
(gdb) <b>cont</b>
Continuing.
*** Error in `/tmp/a.out': double free or corruption (fasttop): 0x0000000000601010 ***
...
关于c - 在变量被释放时中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33066873/
安装并修复我的 VS2015 实例后,我仍然无法让智能感知(服务器端)在我的 MVC View 中工作。当我在 session 中第一次打开 .cshtml 文件并找到 Activitylog 文件时
我是一名优秀的程序员,十分优秀!