ltrace 和 strace 工具中的行号信息

发布于 2024-11-25 18:15:23 字数 338 浏览 1 评论 0原文

我是否可以查看行号和文件名(对于使用 ltrace/strace 运行的程序)以及库调用/系统调用信息。

例如:

code section :: ptr = malloc(sizeof(int)*5); (file:code.c, line:21)

ltrace 或任何其他工具: malloc(20) :: code.c::21

我已经尝试了 ltrace/strace 的所有选项,但无法找到获取此信息的方法。

如果无法通过 ltrace/strace 实现,我们是否有适用于 GNU/Linux 的并行工具选项?

Is it possible that I can view the line number and file name (for my program running with ltrace/strace) along with the library call/system call information.

Eg:

code section :: ptr = malloc(sizeof(int)*5); (file:code.c, line:21)

ltrace or any other tool: malloc(20) :: code.c::21

I have tried all the options of ltrace/strace but cannot figure out a way to get this info.

If not possible through ltrace/strace, do we have any parallel tool option for GNU/Linux?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

浅浅 2024-12-02 18:15:23

您可以在 straceltrace 中组合使用 -i 选项(在调用时输出指令指针)使用addr2line来解析对代码行的调用。

You may be able to use the -i option (to output the instruction pointer at the time of the call) in strace and ltrace, combined with addr2line to resolve the calls to lines of code.

半窗疏影 2024-12-02 18:15:23

不,这是不可能的。为什么不使用 gdb 来实现这个目的呢?

当您使用 gcc 编译应用程序时,请使用 -ggdb 标志将调试器信息获取到您的程序中,然后使用 gdb 或等效前端(ddd 或类似)运行您的程序。

这里是快速 gdb 手册,可以帮助您一些。
http://www.cs.cmu.edu/~gilpin/tutorial/

No It's not possible. Why don't you use gdb for this purpose?

When you are compiling application with gcc use -ggdb flags to get debugger info into your program and then run your program with gdb or equivalent frontend (ddd or similar)

Here is quick gdb manual to help you out a bit.
http://www.cs.cmu.edu/~gilpin/tutorial/

情仇皆在手 2024-12-02 18:15:23

您可以使用 strace-plus 来收集与每个系统调用相关的堆栈跟踪。
http://code.google.com/p/strace-plus/

You can use strace-plus that can collects stack traces associated with each system call.
http://code.google.com/p/strace-plus/

风和你 2024-12-02 18:15:23

很老的问题,但我找到了一种方法来实现OP想要的:
首先使用带有 -k 选项的 strace,这将生成如下所示的堆栈跟踪:

openat(AT_FDCWD, NULL, O_RDONLY)        = -1 EFAULT (Bad address)
 > /usr/lib/libc-2.33.so(__open64+0x5b) [0xefeab]
 > /usr/lib/libc-2.33.so(_IO_file_open+0x26) [0x816f6]
 > /usr/lib/libc-2.33.so(_IO_file_fopen+0x10a) [0x818ca]
 > /usr/lib/libc-2.33.so(__fopen_internal+0x7d) [0x7527d]
 > /mnt/r/build/tests/main(main+0x90) [0x1330]
 > /usr/lib/libc-2.33.so(__libc_start_main+0xd5) [0x27b25]
 > /mnt/r/build/tests/main(_start+0x2e) [0x114e]

每个函数调用的地址都显示在每行的末尾,您可以将其粘贴到 addr2line< /code> 检索文件和行。例如,我们想要在 main() 中找到调用(堆栈跟踪的第五行)。

addr2line -e tests/main 0x1330

它将显示如下内容:

/mnt/r/main.c:55

Pretty old question, but I found a way to accomplish what OP wanted:
First use strace with -k option, which will generate a stack trace like this:

openat(AT_FDCWD, NULL, O_RDONLY)        = -1 EFAULT (Bad address)
 > /usr/lib/libc-2.33.so(__open64+0x5b) [0xefeab]
 > /usr/lib/libc-2.33.so(_IO_file_open+0x26) [0x816f6]
 > /usr/lib/libc-2.33.so(_IO_file_fopen+0x10a) [0x818ca]
 > /usr/lib/libc-2.33.so(__fopen_internal+0x7d) [0x7527d]
 > /mnt/r/build/tests/main(main+0x90) [0x1330]
 > /usr/lib/libc-2.33.so(__libc_start_main+0xd5) [0x27b25]
 > /mnt/r/build/tests/main(_start+0x2e) [0x114e]

The address of each function call are displayed at the end of each line, and you can paste it to addr2line to retrieve the file and line. For example, we want to locate the call in main() (fifth line of the stack trace).

addr2line -e tests/main 0x1330

It will show something like this:

/mnt/r/main.c:55
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文