C++ 地址消毒器:PC位于不可执行区域。也许是一次疯狂的跳跃?

C++ 地址消毒器:PC位于不可执行区域。也许是一次疯狂的跳跃?,c++,debugging,g++,address-sanitizer,C++,Debugging,G++,Address Sanitizer,我编译的代码有错误,我决定使用地址消除器来查找它与g++和选项-Og-g3-fsanize=address-fno省略帧指针的问题 我用了llvm符号 export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer-9 它没有任何有意义的信息可以帮助我在代码中找到问题的根源 它不会转储堆栈跟踪。这意味着什么?如何找到堆栈跟踪或转储地址的位置 更新:使用gdb不会提供更多信息 (gdb) run Starting program: /media/bin/

我编译的代码有错误,我决定使用地址消除器来查找它与
g++
和选项
-Og-g3-fsanize=address-fno省略帧指针的问题

我用了llvm符号

export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer-9
它没有任何有意义的信息可以帮助我在代码中找到问题的根源

它不会转储堆栈跟踪。这意味着什么?如何找到堆栈跟踪或转储地址的位置

更新:使用gdb不会提供更多信息

(gdb) run
Starting program: /media/bin/a.out 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Full compilation was performed in 0.005376 seconds.
Code has an error.
No input file is given


==8965==LeakSanitizer has encountered a fatal error.
==8965==HINT: For debugging, try setting environment variable LSAN_OPTIONS=verbosity=1:log_threads=1
==8965==HINT: LeakSanitizer does not work under ptrace (strace, gdb, etc)

Program received signal SIGABRT, Aborted.
0x00007ffff1eac438 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:54
54  ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
#0  0x00007ffff1eac438 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:54
#1  0x00007ffff1eae03a in __GI_abort () at abort.c:89
#2  0x00007ffff72d14be in ?? () from /usr/lib/x86_64-linux-gnu/libasan.so.5
#3  0x00007ffff72dbe78 in ?? () from /usr/lib/x86_64-linux-gnu/libasan.so.5
#4  0x00007ffff72e0ecf in ?? () from /usr/lib/x86_64-linux-gnu/libasan.so.5
#5  0x00007ffff72e0f05 in ?? () from /usr/lib/x86_64-linux-gnu/libasan.so.5
#6  0x00007ffff1eb137a in __cxa_finalize (d=0x7ffff752e4a0) at cxa_finalize.c:56
#7  0x00007ffff71ca793 in ?? () from /usr/lib/x86_64-linux-gnu/libasan.so.5
#8  0x00007fffffffdc50 in ?? ()
#9  0x00007ffff7de7e27 in _dl_fini () at dl-fini.c:235
Backtrace stopped: frame did not save the PC


@J。。。我希望地址消毒器能正确地完成它的工作,而不是把责任推给调试器。@J。。。不幸的是,地址消毒剂没有创建核心转储来在其上使用gdb。(即使我使用了
export ASAN\u OPTIONS=abort\u on\u error=1:disable\u coredump=0:unmap\u shadow\u on\u exit=1
ulimit-c unlimited
)。我至少不会丢弃帧指针-这些是获得堆栈跟踪所需要的。可能是VMT偏移量/指针地址清理器中的UB,但该清理器不会捕捉到。疯狂的pc值是导致“疯狂跳跃”猜测的原因。如果不是内存损坏,则可能是错误的方法指针。还可以尝试memory Sanitarizer。如果堆栈被破坏,GDB就没有那么大帮助,因为它指望堆栈不会被破坏。我会从dl fini.c:235的
\u dl_fini()开始检查,希望这是我的代码,堆栈没有被完全破坏到完全是谎言的程度。但是
\u dl\u fini()
不是“我的”代码。在程序关闭之前不应该调用它。但是这可能有助于缩小死亡区域。你有全局变量吗?@J..,经过努力,我发现我的none void函数没有返回任何值,但该值也没有在其他任何地方使用。在我添加了一些couts之后,更多的信息开始出现,而它们本不应该影响消毒剂。真奇怪。显示的错误是
错误:AddressSanitizer:正在尝试对线程T0中的0x6030000063a0进行双重释放。当我把none-void函数改为void时,它是固定的。但这很奇怪,因为函数的类型是指针。我原以为什么也不会被释放。“更多”在我看来像是一个编译器错误。@J。。。我希望地址消毒器能正确地完成它的工作,而不是把责任推给调试器。@J。。。不幸的是,地址消毒剂没有创建核心转储来在其上使用gdb。(即使我使用了
export ASAN\u OPTIONS=abort\u on\u error=1:disable\u coredump=0:unmap\u shadow\u on\u exit=1
ulimit-c unlimited
)。我至少不会丢弃帧指针-这些是获得堆栈跟踪所需要的。可能是VMT偏移量/指针地址清理器中的UB,但该清理器不会捕捉到。疯狂的pc值是导致“疯狂跳跃”猜测的原因。如果不是内存损坏,则可能是错误的方法指针。还可以尝试memory Sanitarizer。如果堆栈被破坏,GDB就没有那么大帮助,因为它指望堆栈不会被破坏。我会从dl fini.c:235的
\u dl_fini()开始检查,希望这是我的代码,堆栈没有被完全破坏到完全是谎言的程度。但是
\u dl\u fini()
不是“我的”代码。在程序关闭之前不应该调用它。但是这可能有助于缩小死亡区域。你有全局变量吗?@J..,经过努力,我发现我的none void函数没有返回任何值,但该值也没有在其他任何地方使用。在我添加了一些couts之后,更多的信息开始出现,而它们本不应该影响消毒剂。真奇怪。显示的错误是
错误:AddressSanitizer:正在尝试对线程T0中的0x6030000063a0进行双重释放。当我把none-void函数改为void时,它是固定的。但这很奇怪,因为函数的类型是指针。我原以为什么也不会被释放。对我来说,更多看起来像是一个编译器错误。
(gdb) run
Starting program: /media/bin/a.out 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Full compilation was performed in 0.005376 seconds.
Code has an error.
No input file is given


==8965==LeakSanitizer has encountered a fatal error.
==8965==HINT: For debugging, try setting environment variable LSAN_OPTIONS=verbosity=1:log_threads=1
==8965==HINT: LeakSanitizer does not work under ptrace (strace, gdb, etc)

Program received signal SIGABRT, Aborted.
0x00007ffff1eac438 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:54
54  ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
#0  0x00007ffff1eac438 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:54
#1  0x00007ffff1eae03a in __GI_abort () at abort.c:89
#2  0x00007ffff72d14be in ?? () from /usr/lib/x86_64-linux-gnu/libasan.so.5
#3  0x00007ffff72dbe78 in ?? () from /usr/lib/x86_64-linux-gnu/libasan.so.5
#4  0x00007ffff72e0ecf in ?? () from /usr/lib/x86_64-linux-gnu/libasan.so.5
#5  0x00007ffff72e0f05 in ?? () from /usr/lib/x86_64-linux-gnu/libasan.so.5
#6  0x00007ffff1eb137a in __cxa_finalize (d=0x7ffff752e4a0) at cxa_finalize.c:56
#7  0x00007ffff71ca793 in ?? () from /usr/lib/x86_64-linux-gnu/libasan.so.5
#8  0x00007fffffffdc50 in ?? ()
#9  0x00007ffff7de7e27 in _dl_fini () at dl-fini.c:235
Backtrace stopped: frame did not save the PC