标签: addr2line

如何在Android中使用addr2line

我被我的应用程序困住,因为我无法调试,因为它是多线程的并且因错误SIGSEGV而崩溃.我从LogCat那里获得了很多信息,它在我的本地库中提供了地址.如果我可以将这些地址转换为我的代码,将会很有帮助.

有没有人知道如何使用android-ndk提供的addr2line?

android shared-libraries native-code android-ndk addr2line

74
推荐指数
2
解决办法
8万
查看次数

如何在Linux中使用addr2line命令?

我试图在Unix中使用addr2line命令,但每次它提供与??:0相同的输出.我正在命令addr2line -e a.out 0x4005BDC.我在使用valgrind工具运行这个a.out可执行文件时得到了这个地址,以找到内存泄漏.我还用-g选项编译了源代码.

c linux valgrind addr2line

46
推荐指数
5
解决办法
8万
查看次数

addr2line中的"鉴别器"是什么?

在某些程序中运行addr2line时,我会在行尾给出一个"鉴别器N"注释:

main at /tmp/nsievebits.c:56 (discriminator 3)

手册页没有提到它,快速谷歌搜索似乎主要表明源代码文件,没有明确的解释.这是一些故意无证的功能吗?更重要的是,我应该担心吗?

c c++ addr2line

21
推荐指数
1
解决办法
6218
查看次数

是否有对addr2line的库调用?

我需要从C++程序中获取addr2line提供的信息(来自回溯函数调用的文件和行).是否有类似于addr2line的库调用?

编辑:我在Linux环境中工作.

我知道我可以直接调用addr2line,我知道我可以在我的程序中使用addr2line 的源代码(也是GPL许可).但我想调用库函数(如果存在)更清晰.

编辑:我将使用binutils的bfd,就像addr2line一样.无论如何,bfd意味着什么?

c c++ linux backtrace addr2line

20
推荐指数
2
解决办法
7669
查看次数

glibc函数检索当前的可执行文件名?

我想知道是否有一个glibc函数,我可以使用gcc/g ++来检索当前的可执行文件.

这样做的目的是提供-e参数, addr2line本答案所示

c gcc glibc addr2line

12
推荐指数
2
解决办法
9016
查看次数

addr2line 命令搜索调试符号的路径

我无法使addr2line工作。它确实在三个(不存在的)路径上查找符号:

/usr/bin/*.debug
/usr/bin/.debug/*.debug
/usr/lib/debug/usr/bin/*.debug
Run Code Online (Sandbox Code Playgroud)

但它似乎忽略了默认情况下实际安装所有调试符号的路径:

/usr/lib/debug/.build-id/
Run Code Online (Sandbox Code Playgroud)

我像这样运行 *addr2line** :

addr2line -f -C -e <PathToExecFile> <Addr>
Run Code Online (Sandbox Code Playgroud)

我是否缺少一些配置开关、系统选项或类似的东西?


这是问题陈述,现在是我所说内容的一些证据。在这里,我将使用程序屏幕作为示例:

$ sudo apt-get install screen screen-dbg
$ file /usr/bin/screen
> /usr/bin/screen: setgid ELF 64-bit LSB executable, x86-64, version 1 (SYSV),
  dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32,
  BuildID[sha1]=e9d3cd5073daa6b7365b3787673143edeec589d3, stripped
$ dpkg -L screen-dbg
> /usr/lib/debug/.build-id/e9/d3cd5073daa6b7365b3787673143edeec589d3.debug
Run Code Online (Sandbox Code Playgroud)

这里我们凭经验找到了屏幕的调试符号在哪里:

/usr/lib/debug/.build-id/e9/d3cd5073daa6b7365b3787673143edeec589d3.debug
Run Code Online (Sandbox Code Playgroud)

现在我们运行strace addr2line来查看它尝试访问的位置...

# Get any valid object address
$ objdump -T /usr/bin/screen
> 00000000006697e0

# Use the object address …
Run Code Online (Sandbox Code Playgroud)

c ubuntu addr2line

7
推荐指数
0
解决办法
2270
查看次数

分析由于库有错误而发生的崩溃的回溯

在我的应用程序中,我有设置信号处理程序来捕获Segfaults,并打印bactraces.进程启动时,我的应用程序会加载一些插件库.

如果我的应用程序崩溃了一个段错误,由于主可执行二进制文件中的错误,我可以用以下内容分析回溯:

addr2line -Cif -e ./myapplication 0x4...
Run Code Online (Sandbox Code Playgroud)

它准确地显示了函数和source_file:line_no

但是,如何分析是否由于插件中的错误而发生崩溃,如下面的回溯?

/opt/myapplication(_Z7sigsegvv+0x15)[0x504245]
/lib64/libpthread.so.0[0x3f1c40f500]
/opt/myapplication/modules/myplugin.so(_ZN11ICAPSection7processEP12CONNECTION_TP7Filebufi+0x6af)[0x7f5588fe4bbf]
/opt/myapplication/modules/myplugin.so(_Z11myplugin_reqmodP12CONNECTION_TP7Filebuf+0x68)[0x7f5588fe51e8]
/opt/myapplication(_ZN10Processors7ExecuteEiP12CONNECTION_TP7Filebuf+0x5b)[0x4e584b]
/opt/myapplication(_Z15process_requestP12CONNECTION_TP7Filebuf+0x462)[0x4efa92]
/opt/myapplication(_Z14handle_requestP12CONNECTION_T+0x1c6d)[0x4d4ded]
/opt/myapplication(_Z13process_entryP12CONNECTION_T+0x240)[0x4d79c0]
/lib64/libpthread.so.0[0x3f1c407851]
/lib64/libc.so.6(clone+0x6d)[0x3f1bce890d]
Run Code Online (Sandbox Code Playgroud)

我的应用程序和插件库都使用gcc编译并且未被删除.我的应用程序在执行时,使用dlopen加载plugin.so不幸的是,崩溃发生在我无法在gdb下运行应用程序的站点上.

谷歌疯狂地搜索答案,但所有讨论回溯和addr2line的网站排除了可能需要分析错误插件的情况.我希望一些善良的黑客知道这个困境的解决方案,并且可以分享一些见解.对于其他程序员来说,这将是非常宝贵的.

提前谢谢.

c c++ backtrace debug-backtrace addr2line

6
推荐指数
2
解决办法
2548
查看次数

如何手动将 Android SIGSEGV 地址映射到链接器映射文件?

我的 Java 应用程序有一个 JNI 层,用于与本机 C++ 库通信。当应用程序空闲大约三 (3) 分钟时,应用程序崩溃,LogCat 显示以下堆栈跟踪:

07-13 13:21:35.876: A/libc(9889): Fatal signal 11 (SIGSEGV) at 0x606b0ba4 (code=1), thread 9889 (nc.myapp)
07-13 13:21:35.980: I/DEBUG(4710): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
07-13 13:21:35.980: I/DEBUG(4710): Build fingerprint: 'motorola/ghost_retail/ghost:4.4.3/KXA21.12-L1.21/23:user/release-keys'
07-13 13:21:35.981: I/DEBUG(4710): Revision: 'p300'
07-13 13:21:35.983: I/DEBUG(4710): pid: 9889, tid: 9889, name: nc.myapp  >>> com.company.myapp <<<
07-13 13:21:35.984: I/DEBUG(4710): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 606b0ba4
07-13 13:21:36.093: I/DEBUG(4710): …
Run Code Online (Sandbox Code Playgroud)

c++ java-native-interface android android-ndk addr2line

5
推荐指数
0
解决办法
738
查看次数

如何从base.odex获取函数名称以及地址和偏移量

这是 Android 应用程序崩溃堆栈跟踪:

F 调试:#05 pc 001d0949 /data/app/com.test-2/oat/arm/base.odex(偏移量 0x12a000)

我知道对于“.so”库,我可以使用 addr2line 来获取函数名称。

那么如何处理odex文件呢?

android addr2line

5
推荐指数
0
解决办法
648
查看次数

addr2line如何定位源文件和代码行?

addr2line将地址转换为文件名和行号。我还是调试初学者,对 addr2line 有一些疑问。

  1. 如果正在调试某个.so(二进制)文件,该工具如何找到其源代码文件(从哪里可以获得它!),如果源代码不存在怎么办?

  2. 二进制中的地址与其源代码中的行号之间有什么关系,所以addr2line可以进行这种映射?

linux debugging addr2line

4
推荐指数
1
解决办法
3295
查看次数

反向addr2line

给定一个目标文件和地址,addr2line工具可以将其与源代码中的文件和行号相关联。

我想相反。给定行号和目标文件,我想获得指令地址列表,这些地址对应于源代码中的给定行。

我知道我可以使用objdump -DS并查找一行,但这很不方便,并且需要手动进行过滤才能过滤出地址。如果我给它列出行,您知道有什么工具可以做我想要的吗?

UPD。

我举一个我想要的例子。

我有一组文件行:

src/a.c:14
src/a.c:28
src/b.c:44
Run Code Online (Sandbox Code Playgroud)

我将此列表传递给工具:

cat lines | line2addr -e lib.so
Run Code Online (Sandbox Code Playgroud)

它向我报告这些行的指令地址:

0x442: src/a.c:14
0x444: src/a.c:14
0x44a: src/a.c:14
0x584: src/a.c:28
0x588: src/a.c:28
...
Run Code Online (Sandbox Code Playgroud)

assembly dwarf addr2line

1
推荐指数
1
解决办法
672
查看次数