- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试调试 ngspice 的原因在运行模拟时将烦人的换行符打印到 stderr。我试图在可追溯到 1993 年的 2400 个源文件之一中找到它,但这并不像听起来那么容易!然而,这确实意味着我有一个嵌入了所有调试信息的二进制文件。
我的第一个想法是 strace可以帮助我找到我认为有问题的调用并将其追溯到源代码。例如,我很确定这是有问题的系统调用:
brk(0x55d1a84e9000) = 0x55d1a84e9000
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, {tv_sec=0, tv_nsec=61462905}) = 0
>> write(2, "\n", 1) = 1
getrusage(RUSAGE_SELF, {ru_utime={tv_sec=0, tv_usec=26269}, ru_stime={tv_sec=0, tv_usec=35243}, ...}) = 0
openat(AT_FDCWD, "/proc/self/statm", O_RDONLY) = 3
我曾希望,如果我跟踪一个包含调试信息的可执行文件,strace 会显示源代码中的位置,但这并不是自动发生的,而且手册有点让人不知所措。
我在手册中找到了一个名为 Tracing 的部分,但找不到任何具体内容。
strace 是否可以,如果可以:如何?如果没有,您还有其他建议吗?
最佳答案
事后看来很明显,但一个非常有用的标志是 -k
。从手册页:
-k Print the execution stack trace of the traced processes after each system call.
这需要一个带有调试信息的二进制文件,它会变得非常嘈杂,但结合一个简单的过滤器(在本例中为 -e write
),您最终会得到如下所示的内容:
write(2, "\n", 1
) = 1
> /lib/x86_64-linux-gnu/libc-2.28.so(__write+0x14) [0xea504]
> /lib/x86_64-linux-gnu/libc-2.28.so(_IO_file_write+0x2d) [0x7b3bd]
> /lib/x86_64-linux-gnu/libc-2.28.so(_IO_file_setbuf+0xef) [0x7a75f]
> /lib/x86_64-linux-gnu/libc-2.28.so(_IO_do_write+0x19) [0x7c509]
> /lib/x86_64-linux-gnu/libc-2.28.so(_IO_file_overflow+0x103) [0x7c8f3]
> /home/pipe/src/ngspice/debug/src/ngspice(OUTendPlot+0x1ae) [0xd7643]
> /home/pipe/src/ngspice/debug/src/ngspice(DCop+0x167) [0x4cd788]
> /home/pipe/src/ngspice/debug/src/ngspice(CKTdoJob+0x428) [0x4c70dd]
> /home/pipe/src/ngspice/debug/src/ngspice(if_run+0x3b9) [0xe5d3e]
> /home/pipe/src/ngspice/debug/src/ngspice(dosim+0x428) [0xe02ee]
在跟踪一些函数内联优化之后,我最终可以找到正确的位置。
关于debugging - strace 可以告诉我在我的代码中调用系统调用的位置吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57468021/
我知道strace用途 ptrace做这份工作, 但它需要使用 TRACE_ME 运行目标进程在, 这不适用于已经运行的进程的情况。 它如何在已经运行的进程上工作? 最佳答案 strace -p -
精确是我在这里关注的重点...... mmap(0x37aa74d000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRI
我正在尝试调试 Gammu,一个“移动电话的库和命令行实用程序”,它在与调制解调器正常通信时“超时”。 gammu recognize -> 在指定的超时时间内没有响应。可能是手机未连接。 查看它产生
当我跑 strace -f strace /bin/ls 知道 strace 是如何工作的,它失败了 ptrace(PTRACE_TRACEME, 0, 0, 0) = -1 EPERM (Opera
[root@woyo test]# strace -o /tmp/lsof.strace -p 5625 Process 5625 attached - interrupt to quit q 有谁知
我想用strace跟踪系统调用。读写太多,因此我想将它们排除在外。 这是我的测试: strace -e trace=!read ls 我的电脑(ubuntu 14)无法运行此命令。错误消息是“!ope
我正在研究这个问题并决定自己实现该程序。 Interpreting STRACE output - pipes and forks strace 输出对我来说是不同的: execve("./fork"
我正在尝试调试 ngspice 的原因在运行模拟时将烦人的换行符打印到 stderr。我试图在可追溯到 1993 年的 2400 个源文件之一中找到它,但这并不像听起来那么容易!然而,这确实意味着我有
strace 密码: getcwd("/root"..., 4096) = 6 ltrace 密码: getcwd(NULL, 0)
open("/etc/ld.so.cache", O_RDONLY) = 3 open("/lib/libselinux.so.1", O_RDONLY) = 3 open("/lib/l
我有一个单线程的 unix 进程,它通过 tcp 与其他进程进行通信。 问题如下。 当我启动进程时,它会挂起(没有忙循环),直到我杀死它。 有趣的是,一旦我将 strace 附加到它,它就会继续以预期
我正在使用 strace 来查找程序中可能存在的错误,并且我有以下输出: open(0x7765533c, O_RDONLY) = -1 EACCES (Permission denied) 如何获取
我的 strace 给我这个输出 fcntl64(3, 0xe /* F_??? */, 0xff963a24) = 0 我希望看到类似的东西,在那里我可以看到 readalbe 内容而不是地址...
我有一个启动 libmicrohttpd 网络服务器(它管理自己的线程)的程序,然后在主线程中调用“暂停”,这样整个程序就不会退出。 我正在尝试对这个程序进行 strace,但是一旦我进入“暂停”调用
我想在后台运行 strace。例如,我在跑 strace -esetsid setsid sleep 123 但我想继续运行其他东西,直到 setsid 返回。显然,只需将 & 附加到 sleep 1
我有一个作为守护进程运行的 perl 脚本。它每 10 秒访问一次数据库,如果队列中有任何作业,它会生成一个单独的 shell 来执行单个作业。但脚本经常无法从数据库获取作业。 理想情况下应该像这
我知道它使用 ptrace 来实现, 它可以在寄存器中获取参数, 但他们只是数字, strace如何将它们转换成文字信息? 它只是针对每个系统调用的硬编码吗? 最佳答案 基本上,是的,它是硬编码的。如
我正在编写一个 python 程序,通过使用 ctypes 的挂载系统调用来挂载 fuse 文件系统。现在它在挂载系统调用中给出无效参数错误。我检查了所有的论点,它们似乎是正确的。我听 friend
尝试调试不返回 bash 提示符的程序,我使用了 strace并给它 PID。该程序是一个二进制文件,我没有源代码。根据strace , 有一个 -1 EBADF (Bad file descript
我正在尝试调试应用程序的启动。我想使用 strace 来跟踪应用程序在启动期间执行的系统调用,但是一旦应用程序启动,我不希望 strace 但是很难追踪到应用程序的启动。 有没有办法捕获应用程序启动的
我是一名优秀的程序员,十分优秀!