在远程嵌入式设备上使用核心文件的 GDB - 如何获取有关回溯的更多信息?

GDB with corefile on remote embedded device - How to get more information about backtrace?

本文关键字:获取 何获取 信息 回溯 嵌入式 GDB 文件 核心      更新时间:2023-10-16

我有一个核心转储,来自在嵌入式imx6板(yocto linux)上运行的C++应用程序。我可以将gdb放在盒子上并在终端中运行它以检查核心文件,就像这样很好:

gdb myApplication core.udpsrc256:src.1520419431.5526

我得到的信息非常有限,确实需要更多地了解导致核心转储的原因。我所拥有的只是应用程序的打印输出:

(myApplication:5526): GLib-ERROR **: ../../glib-2.46.2/glib/gmem.c:100: failed to allocate 65611 bytes
./run-app.sh: line 8:  5526 Trace/breakpoint trap   (core dumped) XDG_RUNTIME_DIR=/run/user/root ./myApplication

此外,核心转储回溯提供了一些无用的东西。我需要知道导致这个框架的堆栈中的更多东西:

#0  0x75ff1910 in raise () from /lib/libc.so.6
[Current thread is 1 (LWP 5533)]
(gdb) 
(gdb) 
(gdb) bt
#0  0x75ff1910 in raise () from /lib/libc.so.6
#1  0x6b169558 in g_logv () from /usr/lib/libglib-2.0.so.0
#2  0x6b169610 in g_log () from /usr/lib/libglib-2.0.so.0
#3  0x6b1681c4 in g_malloc () from /usr/lib/libglib-2.0.so.0
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

旁注 - 当我启动 gdb 时有一些警告:

GNU gdb (GDB) 7.10.1
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "arm-poky-linux-gnueabi".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from qt5qmlvideo...done.
warning: exec file is newer than core file.
[New LWP 5533]
[New LWP 5526]
[New LWP 5531]
[New LWP 5528]
[New LWP 5534]
[New LWP 21064]
[New LWP 5536]
[New LWP 21065]
[New LWP 5532]
[New LWP 5527]
[New LWP 5530]
[New LWP 5537]
warning: Could not load shared library symbols for linux-vdso.so.1.
Do you need "set solib-search-path" or "set sysroot"?
warning: Unable to find libthread_db matching inferior's thread library, thread debugging will not be available.
warning: Unable to find libthread_db matching inferior's thread library, thread debugging will not be available.
Core was generated by `./qt5qmlvideo -platform wayland'.
Program terminated with signal SIGTRAP, Trace/breakpoint trap.
#0  0x75ff1910 in raise () from /lib/libc.so.6
[Current thread is 1 (LWP 5533)]
(gdb) 

谁能帮忙?我需要一些 gdb 警告的东西吗?或者我可以在其他一些配置中重建我的应用程序及其依赖项,以提供更多输出?谢谢!

还有一些可能很重要的注意事项——

这是一个运行 gstreamer 管道的多线程应用程序。许多 gstreamer 插件生成自己的线程,其中一个在这个管道中是"udpsrc"。我想知道是否是因为在其中一个线程中发生的失败是我无法获取详细信息的原因,但我想知道如何让它在可能的情况下显示详细信息!

(1) 这

你需要"设置solib-search-path"还是"set sysroot"?

是一个问题。检查 linux-vdso.so.1 所在的路径(在您的设备上),并将其包含在 solib-search-path 中。程序使用的其他共享对象库也是如此。例如,如果一些共享对象库在

/lib 中,一些在/usr/adowdy/lib 中,一些在/usr/adowdy/arm/lib 中,你可以说:

(gdb) set solib-search-path

/lib:/usr/adowdy/lib:/usr/adowdy/arm/lib

(2)

警告:找不到匹配libthread_db下级线程 库,线程调试将不可用。

也是一个问题。查看此问题的答案

(3)

无法分配 65611 字节

是一个线索。您是否试图分配负数字节(也许是 65536 - 65611 = -75 字节)?

此外,核心转储回溯提供了一些无用的东西。

它并非完全没用。堆栈跟踪和来自应用程序的消息说的是同一件事:您的应用程序内存不足(malloc无法分配 65611 字节)。

虽然更完整的堆栈会告诉你哪个特定的调用失败g_malloc,但在实践中很可能无关紧要 - 如果这个g_malloc没有失败,下一个就会失败。

您可能有内存泄漏,或者只是为系统允许的内存分配了太多内存。

您应该研究为解决此确切问题而构建的许多调试工具。