Gdb 原因:地址消毒器:未知地址上的SEGV(空指针)

Gdb 原因:地址消毒器:未知地址上的SEGV(空指针),gdb,sanitizer,address-sanitizer,Gdb,Sanitizer,Address Sanitizer,我需要一些关于如何识别故障源的建议 用ASAN编译: ==21093==ERROR: AddressSanitizer: SEGV on unknown address 0x000000000000 (pc 0x7f09d744d882 bp 0x000000001000 sp 0x62100001c538 T0) ASAN:DEADLYSIGNAL AddressSanitizer: nested bug in the same thread, aborting. 从gdb开始: Progr

我需要一些关于如何识别故障源的建议

用ASAN编译:

==21093==ERROR: AddressSanitizer: SEGV on unknown address 0x000000000000 (pc 0x7f09d744d882 bp 0x000000001000 sp 0x62100001c538 T0)
ASAN:DEADLYSIGNAL
AddressSanitizer: nested bug in the same thread, aborting.
从gdb开始:

Program received signal SIGSEGV, Segmentation fault.    
0x00007ffff5eeb882 in __memset_avx2_erms () from /usr/lib/libc.so.6
(gdb) bt
#0  0x00007ffff5eeb882 in __memset_avx2_erms () from /usr/lib/libc.so.6
#1  0xbebebebebebebebe in ?? ()
#2  0xbebebebebebebebe in ?? ()
...
1。编辑:

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff5eeb882 in __memset_avx2_erms () from /usr/lib/libc.so.6
(gdb) bt
#0  0x00007ffff5eeb882 in __memset_avx2_erms () from /usr/lib/libc.so.6
#1  0xbebebebebebebebe in ?? ()
#2  0xbebebebebebebebe in ?? ()
#3  0xbebebebebebebebe in ?? ()
#4  0xbebebebebebebebe in ?? ()
...
(gdb) record instruction-history
17798      0x00007ffff5eeb8b6 <__memset_avx2_unaligned_erms+22>:    cmp    $0x40,%rdx
17799      0x00007ffff5eeb8ba <__memset_avx2_unaligned_erms+26>:    ja     0x7ffff5eeb8ca <__memset_avx2_unaligned_erms+42>
17800      0x00007ffff5eeb8ca <__memset_avx2_unaligned_erms+42>:    cmp    $0x800,%rdx
17801      0x00007ffff5eeb8d1 <__memset_avx2_unaligned_erms+49>:    ja     0x7ffff5eeb870 <__memset_avx2_erms>
17802      0x00007ffff5eeb870 <__memset_avx2_erms+0>:   vzeroupper 
17803      0x00007ffff5eeb873 <__memset_avx2_erms+3>:   mov    %rdx,%rcx
17804      0x00007ffff5eeb876 <__memset_avx2_erms+6>:   movzbl %sil,%eax
17805      0x00007ffff5eeb87a <__memset_avx2_erms+10>:  mov    %rdi,%rdx
17806      0x00007ffff5eeb87d <__memset_avx2_erms+13>:  rep stos %al,%es:(%rdi)
17807      0x00007ffff5eeb87f <__memset_avx2_erms+15>:  mov    %rdx,%rax
上面的输出编译为64位(x86_64),在32位上生成以下输出:

==8361==ERROR: AddressSanitizer failed to allocate 0x200000 (2097152) bytes of SizeClassAllocator32 (error code: 12)
==8361==Process memory map follows:
    0x00200000-0x00300000
    0x00400000-0x00500000
...
    0xf7791000-0xf7792000   /lib32/ld-2.24.so
    0xf7800000-0xffd00000
    0xffe34000-0xffe55000   [stack]
==8361==End of process memory map.
==8361==AddressSanitizer CHECK failed: ../../../../../src/libsanitizer/sanitizer_common/sanitizer_common.cc:180 "((0 && "unable to mmap")) != (0)" (0x0, 0x0)
ERROR: Failed to mmap
2。编辑:

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff5eeb882 in __memset_avx2_erms () from /usr/lib/libc.so.6
(gdb) bt
#0  0x00007ffff5eeb882 in __memset_avx2_erms () from /usr/lib/libc.so.6
#1  0xbebebebebebebebe in ?? ()
#2  0xbebebebebebebebe in ?? ()
#3  0xbebebebebebebebe in ?? ()
#4  0xbebebebebebebebe in ?? ()
...
(gdb) record instruction-history
17798      0x00007ffff5eeb8b6 <__memset_avx2_unaligned_erms+22>:    cmp    $0x40,%rdx
17799      0x00007ffff5eeb8ba <__memset_avx2_unaligned_erms+26>:    ja     0x7ffff5eeb8ca <__memset_avx2_unaligned_erms+42>
17800      0x00007ffff5eeb8ca <__memset_avx2_unaligned_erms+42>:    cmp    $0x800,%rdx
17801      0x00007ffff5eeb8d1 <__memset_avx2_unaligned_erms+49>:    ja     0x7ffff5eeb870 <__memset_avx2_erms>
17802      0x00007ffff5eeb870 <__memset_avx2_erms+0>:   vzeroupper 
17803      0x00007ffff5eeb873 <__memset_avx2_erms+3>:   mov    %rdx,%rcx
17804      0x00007ffff5eeb876 <__memset_avx2_erms+6>:   movzbl %sil,%eax
17805      0x00007ffff5eeb87a <__memset_avx2_erms+10>:  mov    %rdi,%rdx
17806      0x00007ffff5eeb87d <__memset_avx2_erms+13>:  rep stos %al,%es:(%rdi)
17807      0x00007ffff5eeb87f <__memset_avx2_erms+15>:  mov    %rdx,%rax
程序接收信号SIGSEGV,分段故障。
0x00007ffff5eeb882在/usr/lib/libc.so.6中的
(gdb)英国电信
#0 0x00007FF5EEB882,位于/usr/lib/libc.so.6中的
#1 0xBEBEBE in??()
#2 0xBEBEBE in??()
#3 0xBEBEBE in??()
#4 0xBEBEBE in??()
...
(gdb)记录指令历史记录
17798 0x00007FF5EEB8B6:cmp$0x40,%rdx
17799 0x00007FF5EEB8BA:ja 0x7ffff5eeb8ca
17800 0x00007FF5EEB8CA:cmp$0x800,%rdx
17801 0x00007FF5EEB8D1:ja 0x7ffff5eeb870
17802 0x00007ffff5eeb870:vzeroupper
17803 0x00007ffff5eeb873:mov%rdx,%rcx
17804 0x00007ffff5eeb876:movzbl%sil,%eax
17805 0x00007ffff5eeb87a:mov%rdi,%rdx
17806 0x00007ffff5eeb87d:代表库存%al,%es:(%rdi)
17807 0x00007ffff5eeb87f:mov%rdx,%rax
不确定这意味着什么/为什么会导致SEG故障

我需要一些关于如何识别故障源的建议

GDB堆栈跟踪是典型的堆栈溢出,类似于:

int main()
{
  char buf[1];
  memset(buf, 0xbe, 1<<20);
}
intmain()
{
char-buf[1];

memset(buf,0xbe,1是否在不同的机器/环境上构建和运行

当使用asan编译的可执行文件在不同的环境/机器上构建和运行时,我观察到这种SEGFULTS(不要观察库版本是否相同)。也就是说,没有asan,应用程序在不同的机器上运行良好

在我的情况下,当我在不同的计算机上运行带有地址消毒剂的应用程序时:

./dummy_logger
ASAN:SIGSEGV
=================================================================
==18213==ERROR: AddressSanitizer: SEGV on unknown address 0x00000000 (pc 0xf7f45e60 bp 0x1ffff000 sp 0xffab0a4c T16777215)
    #0 0xf7f45e5f in _dl_get_tls_static_info (/lib/ld-linux.so.2+0x11e5f)
    #1 0xf7a59d1c  (/usr/lib/i386-linux-gnu/libasan.so.2+0xacd1c)
    #2 0xf7a4ddbd  (/usr/lib/i386-linux-gnu/libasan.so.2+0xa0dbd)
    #3 0xf7f438ea  (/lib/ld-linux.so.2+0xf8ea)
    #4 0xf7f34cb9  (/lib/ld-linux.so.2+0xcb9)

AddressSanitizer can not provide additional info.
SUMMARY: AddressSanitizer: SEGV ??:0 _dl_get_tls_static_info
==18213==ABORTING

并且在编译它的机器上运行良好。

您应该告诉编译器在executeable@mch:它是用debug编译的symbols@mchOPs堆栈已被破坏(请参阅返回地址)因此,debuginfo不是这里的问题。不幸的是,该应用程序使用了一个更大的框架,使用了某种堆栈切换,因此不可能只举一个简单的例子