gpt4 book ai didi

c - 段错误 - 调试程序集 gdb

转载 作者:行者123 更新时间:2023-12-01 03:32:35 25 4
gpt4 key购买 nike

我正在调试段错误。这是在 ff_printf 调用时出错的代码片段。

for (p = &v[QUEUE], i = 0; i < p->used; i++) {
queue_t *q = p->data[i];
ff_printf(F_DB, " %02u %s\n",
p->cp, q->tq->queue_name);
}

段错误在 ff_printf 行。当我通过 gdb 调试时,我可以解析 p->cp 和 q->tq->queue_name。 F_DB 也得到解析,因为它是一个枚举。因此,它不会因为无效遵从而出现段错误。

代码反汇编后,我得到了上述代码片段的以下汇编,用于 ff_printf 行。

   0x0000000000449b88 <+360>:   mov    -0x14(%r13),%rax
0x0000000000449b8c <+364>: movzwl %r10w,%edx

0x0000000000449b90 <+368>: movzwl (%rbx),%r9d
0x0000000000449b94 <+372>: mov $0x56a4d9,%r8d
0x0000000000449b9a <+378>: mov $0x5,%ecx
0x0000000000449b9f <+383>: mov $0x5bb,%esi
0x0000000000449ba4 <+388>: mov $0x56a27b,%edi
0x0000000000449ba9 <+393>: mov (%rax,%rdx,8),%rax
0x0000000000449bad <+397>: mov $0x56aec0,%edx
=> 0x0000000000449bb2 <+402>: mov 0x88(%rax),%rax
0x0000000000449bb9 <+409>: mov %r10d,-0x48(%rbp)
0x0000000000449bbd <+413>: mov %rax,(%rsp)
0x0000000000449bc1 <+417>: xor %eax,%eax
0x0000000000449bc3 <+419>: callq 0x4423c0 <ff_printf>

现在,我确实调试了寄存器并使用代码片段进行了验证。我能够通过汇编调试(即通过寄存器)获得 F_DB、p->cp、q->tq->queue_name。我观察到 %rax 的值为 0x0。我观察到段错误发生在调用 ff_printf 库之前。

我有两个问题:

1:我如何映射这个

"    => 0x0000000000449bb2 <+402>:  mov    0x88(%rax),%rax" 

到代码片段?

我观察到 %rax 是通过

填充的
0x0000000000449b88 <+360>:  mov    -0x14(%r13),%rax

我认为是将($r13 - 0x14 的地址)移动到 %rax。

0x0000000000449ba9 <+393>:  mov    (%rax,%rdx,8),%rax

我认为它是 mov (address $rax+ address $rdx+ 8) to %rax。我对吗 ?

2:我不确定是否有任何堆栈损坏。这个段错误非常非常罕见,我无法重现。如何从这里进一步回溯?

最佳答案

p = &v[队列]

是错误的,如果 QUEUE 是 v 的大小,因为它的索引范围从零到 QUEUE-1。

所以用

p = &v[QUEUE-1]

或者,如果您想从 v 的开头开始,请使用

p = v

关于c - 段错误 - 调试程序集 gdb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31106851/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com