gpt4 book ai didi

c - 是 GDB 错误还是英特尔编译器错误还是我的代码?

转载 作者:太空宇宙 更新时间:2023-11-04 02:43:30 25 4
gpt4 key购买 nike

我正在为 NetBSD 系统使用英特尔的 ICC 编译器。我一直在与一个错误作斗争,当我从核心转储中观察到这一点时,我感到更加惊讶——来自 gdb 中两种不同机制的符号地址不相同。

当使用“信息符号 connection_out”和 p &connection_out 检查时,变量 connection_out 似乎具有不同的地址。

它看起来像是一个编译器问题,其中优化到 CPU 寄存器的 badf_errcnt 被分配了一个内存位置,此后编译器混淆了两者?

我启用了编译器 O2 级优化。有问题的变量是一个全局静态 int 变量。我不认为指针别名在这里起作用,因为正在使用变量的内存位置。

我看到未剥离的符号文件也同意反汇编代码中的地址。

gdb$ disassemble sigusr1_rt
Dump of assembler code for function sigusr1_rt:
0x01845000 <+0>: push %ebp
0x01845001 <+1>: mov %esp,%ebp
0x01845003 <+3>: sub $0x8,%esp
0x01845006 <+6>: movl $0x16c156a,0x188f05c
0x01845010 <+16>: mov %ebp,%esp
0x01845012 <+18>: pop %ebp
0x01845013 <+19>: ret
0x01845014 <+20>: lea 0x0(%esi),%esi
0x0184501a <+26>: lea 0x0(%edi),%edi
End of assembler dump.
gdb$ info symbol 0x188f05c
connection_out in section .bss of /sites/eqx/work/swcores/tripunjay/F10ACOREDIR/f10cp_sshd.login-eqx-06.6402/sshd
gdb$ p &connection_out
$10 = (int *) 0x188f048
gdb$ p/d 0x188f05c - 0x188f048
$11 = 20
gdb$ p/x 0x188f05c - 0x188f048
$12 = 0x14
gdb$ info symbol 0x188f048
badf_errcnt.5450.0.13 in section .bss of /sites/eqx/work/swcores/tripunjay/F10ACOREDIR/f10cp_sshd.login-eqx-06.6402/sshd
gdb$ p &badf_errcnt
No symbol "badf_errcnt" in current context.
gdb$ select-frame 5
gdb$ frame
Stack level 5, frame at 0xbb4aca20:
eip = 0x1846007 in wait_until_can_do_something (serverloop.c:404); saved eip 0x1846698
called by frame at 0xbb4b0af0, caller of frame at 0xbb4ac9d0
source language c.
Arglist at 0xbb4aca18, args: readsetp=0xbb4b0ab4, writesetp=0xbb4b0ab8, maxfdp=0x4, nallocp=0xbb4b0abc, max_time_milliseconds=0x0
Locals at 0xbb4aca18, Previous frame's sp is 0xbb4aca20
Saved registers:
ebx at 0xbb4aca00, ebp at 0xbb4aca18, esi at 0xbb4ac9fc, edi at 0xbb4aca04, eip at 0xbb4aca1c
readsetp = 0xbb4b0ab4
writesetp = 0xbb4b0ab8
maxfdp = 0x4
nallocp = 0xbb4b0abc
max_time_milliseconds = 0x0
badf_errcnt = <optimized out>
tv = <optimized out>
tvp = <optimized out>
client_alive_scheduled = 0x0
gdb$ p &badf_errcnt
Can't take address of "badf_errcnt" which isn't an lvalue.


prompt$ nm sshd.unstripped | grep connection_out
0188f05c b connection_out

最佳答案

这看起来像是 ICC 生成的调试信息或链接器中可能存在的错误。

特别是,符号表中 connection_out 的地址似乎与 .debug_info 中的 connection_out 地址不匹配。

要在符号表中查找 &connection_out,请执行以下操作:

readelf -Ws /sites/.../f10cp_sshd.login-eqx-06.6402/sshd |
grep connection_out

并与来自的输出进行比较

readelf -wi /sites/.../f10cp_sshd.login-eqx-06.6402/sshd

它应该有一个 connection_out 条目,类似于:

<1><b6>: Abbrev Number: 9 (DW_TAG_variable)
<b7> DW_AT_name : (indirect string, offset: 0x84): connection_out
<bb> DW_AT_decl_file : 1
<bc> DW_AT_decl_line : 5
<bd> DW_AT_type : <0x73>
<c1> DW_AT_external : 1
<c1> DW_AT_location : 9 byte block: 3 60 10 60 0 0 0 0 0 (DW_OP_addr: 601060)

如果符号表中的地址与 .debug_info(DW_AT_location 条目)中的地址不同,则说明存在编译器(或链接器)错误。如果它们相同,则说明存在 GDB 错误。

关于c - 是 GDB 错误还是英特尔编译器错误还是我的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29619209/

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