跟踪对共享库的调用
我正在根据Linux开发一个程序. 出于调试目的,我想将所有从程序中的呼叫追踪到某个(最好共享)库. (我不想追踪库中发生的电话.) 对于syscalls,有链条.是否有任何工具可以追踪到共享库的电话? 解决方案 您要寻找的工具称为ltrace.它允许从程序中追踪所有(或一组给定)库的任何调用. 例如,以下呼叫将列出共享库加载的外部功能的任何呼叫: $> ltrace ls / __libc_start_main(0x4028c0, 2, 0x7fff1f4e72d8, 0x411e60 strrchr("ls", '/') = nil setlocale(LC_ALL, "") = "en_US.UTF-8" bindtextdomain("coreutils", "/usr/share/locale") =
56 2024-04-22
编程技术问答社区
如何解释PTRACE_PEEKTEXT的返回值
我一直在不使用ptrace_syscall来熟悉寄存器的情况下进行Mini strace 程序的重新设计. 因此,在使用ptrace(ptrace_getregs,...)设置user_reg_struct字段之后,在我的代码中,我正在使用ptrace(ptrace_peekdata,...)从中读取. 并不真正知道该函数使用该功能的数据(syscalls等...),我开始查看一些代码 int is_a_syscall() { struct user_reg_struct regs; unsigned short int ret; ret = ptrace(PTRACE_PEEKDATA, pid, regs.rip, 0); if (ret == 0xFFFF) { perror("failed") exit(1); } if (ret == 0x80CD || ret == 0x50F) return (true); return (false);
8 2024-04-10
编程技术问答社区
我应该如何使用strace来snif串口?
我正在Linux上编写一个应用程序,需要访问串行端口. 为了调试目的,我需要嗅探什么和/或通过串行端口. 我环顾四周,发现我可以使用Strace做到这一点.所以我尝试了以下内容: - 我打印我使用的串行设备的file_descriptor. (重新启动我的应用程序几次后,我向自己保证,我的应用程序从内核中获得的file_descriptor号码是" 4" - 如果我以strace -e write=4 ./myapp启动我的应用程序,我希望仅从file_descriptor" 4"中获取消息.相反,我得到了输出的浪漫: read(5, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\300Q\254C4\0\0\0"..., 52 fstat64(5, {st_mode=S_IFREG|0644, st_size=1448930, ...}) = 0 mmap2(0x43
2 2024-04-08
编程技术问答社区
在共享库的构建选项中加入"| rpath,/usr/lib "会导致隔离故障。
我有一个Hello World程序. #include #include int main() { printf("hello world! \n"); return 0; } i在链接阶段的构建中添加-lmicroxml,以链接到库libmicroxml.so 当我启动程序时,我会得到细分错误.分割故障与libmicroxml.so的负载有关.在我的Helleo世界计划执行之后,这里是 strace ./test execve("./test", ["./test"], [/* 11 vars */]) = 0 old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|0x4000000, -1, 0) = 0x777de000 stat("/etc/ld.so.cache", 0x7f944760) = -1 ENO
8 2024-04-08
编程技术问答社区
如何从strace输出中解码这些信息
我写了一个小的GO脚本,并使用strace追踪了它 尽管这个脚本,我还是尝试使用NetLink协议从内核中获取审核消息,就像审计一样. 以下是我的GO脚本上的strace输出 - 我试图找到审计提供给sendto函数的论点. 当我在审核上运行频率时,我将遵循以下输出 sendto(3, "\20\0\0\0\350\3\5\0\1\0\0\0\0\0\0\0", 16, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 16 ,当我进入我的go文件时,我将获得以下输出. 我希望解码此语句的第二个参数 sendto(3, "\21\0\0\0\350\3\5\0\1\0\0\0\0\0\0\0\t", 17, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 17 是特定的 "\21\0\0\0\350\3\5\0\1\0\0\0\
8 2024-04-08
编程技术问答社区
这些strace系统调用是什么意思?
我需要介绍我使用Strace的应用程序的性能.但是,我真的不知道如何解释各种系统所谓的strace发出.其中一些示例如下: (A) lseek(3, 1600, SEEK_SET) = 1600 (B) write(3, "G_DATA 300 0 "..., 800) = 800 (C) close(3) = 0 (D) mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b600b179000 (E) munmap(0x2b600b179000, 4096) = 0 (F) fstat(3, {st_mode=S_IFREG|0644, st_size=1600, ...}) = 0 如果某人可以简要地解释这些从(a)到(
12 2024-04-07
编程技术问答社区
Ptrace如何在Linux中工作?
ptrace系统呼叫允许父进程检查附件的孩子.例如,在Linux中,strace(使用ptrace系统调用实施)可以检查由子进程调用的系统调用. 当附件的子进程调用系统调用时,可以通知父进程.但是,这到底是怎么发生的呢?我想知道这种机制背后的技术细节. 预先感谢您. 解决方案 当附件的子进程调用系统调用时,可以通知父进程.但是那到底是怎么发生的? 带有PTRACE_ATTACH的父进程调用ptrace,他的孩子使用PTRACE_TRACEME选项调用ptrace.这对将通过填写 task_struct task_struct task_struct task_struct ( kernel/ptrace.c:sys_ptrace.c:sys_ptrace ,孩子会在ptrace struct task_struct的字段中具有PT_PTRACED标志,而ptracer过程的pid作为父,ptrace_entry列表 - __ptrace_link ; par
22 2024-04-07
编程技术问答社区
如何拦截linux信号?
我需要从任何二进制文件中拦截和跟踪信号,例如Strace在Linux下进行. 我不需要像真正的一个那条那样的冗长输出. 我只想知道它是如何工作的,如何拦截信号以及如何跟踪它们. 预先感谢:) 解决方案 strace使用 ptrace() 系统呼吁跟踪,哪个还允许您拦截(可能是操纵)发送到该过程的信号. 这是一个很小的例子: #include #include #include #include #include #include #include int main(int argc, char **argv) { /* simple example, child is traced, uses alarm which causes a signal to be * set up *
10 2024-04-06
编程技术问答社区
当试图将GDB附加到一个进程时,如何解决 "不允许进行ptrace操作"?
我正在尝试使用 gdb ,但它返回: 附加过程29139 无法附加进程.如果您的UID匹配目标的UID 流程,检查/proc/sys/kernel/yama/ptrace_scope的设置,或尝试 再次作为root用户.有关更多详细信息,请参见/etc/sysctl.d/10-ptrace.conf ptrace:不允许操作. gdb-debugger返回: 未能附加进程,请检查特权并重试. strace返回: 附件:ptrace(ptrace_attach,...):操作不允许 我更改了" kernel.yama.ptrace_scope" 1至0和/proc/sys/kernel/yama/ptrace_scope 1至0,然后尝试了set environment LD_PRELOAD=./ptrace.so: #include int ptrace(int i, int j, int k, int l) {
36 2024-04-06
编程技术问答社区
真实设备中的Android strace
我有以下情况,我想在Android手机上监视系统电话,所以 我做了一个脚本来做到这一点.使用Android模拟器的工作原理非常完美(将应用程序的痕迹写在我的Ubuntu上的特定文件中). 问题是当我附上真实手机分析时,它在结果文件中说以下内容: ptrace attach failed: Operation not permitted 我正在使用此代码来获取它,但是我不明白它为什么在模拟器上工作,而不是在扎根的真实设备上工作. 这是我在perl中使用的comand: system("$dirTools/adb -s $Device shell strace -p $PID[1]>$dirRecordDataSet/$Date/$appName &"); 有什么建议吗?预先感谢 解决方案 Maye是ADB守护程序的运行,其特权有限.您可以尝试使用setuid roo安装strace.这是对此的曼页建议: setuid安装 如果将strace安装
34 2024-02-14
编程技术问答社区
安卓系统中的strace shell命令问题
我正在构建一个监视器应用程序,该应用程序在后台运行并记录通过使用 strace 命令的当前运行应用程序执行的系统调用. String cmd="strace -p "+processID+" -o /mnt/sdcard/traceFile_"+processID+".txt"; Runtime.getRuntime().exec(cmd); there processID 是当前运行过程的PID,它是从实施的其他方法中获得的.它可以通过所有执行的系统调用信息来记录其正确监控的第一个应用程序的系统调用.但是,当启动新应用程序(第二个应用程序)时, processID 会正确更新,但是文件 tracefile_processid 写成为空文件. 我无法弄清楚为什么会发生.是因为仍在那里监视的第一个应用程序的strace执行吗?如果是这样,我如何执行A ^C终止该会话并按照ADB Shell命令提示符开始新会话?请帮助我..... 解决方案 如果您想像您所说的那样"^c",
26 2024-02-11
编程技术问答社区
安卓:如何使用ADB shell am start来跟踪一个应用程序
我需要在SDK模拟器中依靠Android应用程序的帮助. 这是我的设置: 我有一个运行Android API的Android SDK仿真器4.03 ADB壳连接到仿真器. 我可以使用ADB安装文件名安装APK 我能够使用ADB Shell am start -a android.intent.action.Main -n com.akproduction.notepad/com.akproduction.notepad.NoteList 运行该应用程序 我尝试使用(adb shell)strace am start -a android.intent.action.Main -n com.akproduction.notepad/com.akproduction.notepad.NoteList划线,但我一无所获! 如何跟踪Android应用程序的运行时行为及其安装? (P.S.测试应用程序位于在这里. 解决方案 实际上是通过分配Zygot
18 2024-01-29
编程技术问答社区
服务响应时间慢:Java SecureRandom和/dev/random
我试图调试由Tomcat上部署的应用程序提供的一些缓慢响应. 现在,我专注于SecureRandom和/dev/random(已经调查并排除了其他一些可能的原因). 模式如下: 第一个呼叫完全需要 30.0 xy xy seconds tomcat重新启动(即使启动后4分钟到达请求到达) ) 后来,有些调用完全需要 15.0 pq秒(我无法建立特定的模式, pq 是TP99中花费的时间近似时间) 服务调用涉及加密和解密( aes/ecb/pkcs5padding ). 是否有可能导致Secuererandom Init/重新流动? (尽管有一个日志在catalina.log上写的日志,"Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [28,760] milliseconds.") 另外,为了检查/dev/random或/dev/urand
10 2024-01-19
编程技术问答社区
如何调试一个长期运行的php脚本?
问题是脚本很长时间后挂断了. strace 返回这样的东西,没有其他东西: Process 7286 attached - interrupt to quit restart_syscall() = 0 poll([{fd=13, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout) clock_gettime(CLOCK_MONOTONIC, {1817569, 74651533}) = 0 clock_gettime(CLOCK_MONOTONIC, {1817569, 74734744}) = 0 clock_gettime(CLOCK_MONOTONIC, {1817569, 74812047}) = 0 poll([{fd=13, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}],
8 2023-12-20
编程技术问答社区
Windows的Systrace
我正在寻找相当于 stracent ,但是想知道是否还有其他选择.具体来说,我正在寻找一种特定的方法来执行系统呼叫策略,尽管这可以是事实之后而不是积极停止它们. 目前有一个很好的方法吗? 解决方案 windbg的logger.exe是最接近strace的: https://learn.microsoft.com/en-us/windows-hardware/drivers/debugger/logger-and-logger-and-logviewer 编辑:还有windbg的wt: https://learn.microsoft.com/en-us/windows-hardware/drivers/debugger/wt--trace--trace-and-watch-data- 其他解决方案 一些选项: 另外,请参见有关Windows 7中内置的工具的文章: 核心OS工具 其他解决方案 博士记忆( http://drmemory.org
14 2023-12-05
编程技术问答社区
在Java/WAS 8.5自由配置文件中,关于套接字绑定的令人气愤的heisenbug
我在Java 6/WebSphere 8.5上获得套接字绑定错误(Liberty配置文件,删除,可用版本的WebSphere版本).杀死和启动应用程序服务器时,我会得到: [错误] CWWKO0221E:TCP通道defaulthttpendpoint初始化 没有成功.插座绑定未成功用于主机 *和端口 9988.端口可能已经在使用. 这是因为Java或尚未正确发布IPv6插座. 但是,这是障碍:当我通过strace运行WLP(使用-f选项跟踪子进程)时,绑定错误确实 发生. 发生了什么事?为什么我不能通过strace? 抓住它 我可以通过指定soReuseAddress来解决这个问题,但是在这里我担心的是为什么/如何通过strace抓住这个问题(不依赖愚蠢的运气,也就是说),为什么它不起作用? 解决方案 您可能会发现添加 soReuseAddr httpEndpoint配置的选项有帮助,尤其是在Linux平台上.例如,
20 2023-12-03
编程技术问答社区
使用ptrace提取系统呼叫名称和参数
我正在处理一个分配,其中我必须使用ptrace来实现strace.到目前为止,我已经找到了如何提取系统呼叫号码和返回值: //In parent process struct user_regs_struct regs; ptrace( PTRACE_GETREGS, child_pid, 0, ®s ); //child_pid is the pid of child process executing the required program //or system call passed as command line arguments syscall_num = regs.orig_rax; syscall_retval = regs.rax; 但是我找不到如何提取系统呼叫名称和参数. 谁能建议一种方法? 解决方案 要获取系统调用的参数,您必须一一读取寄存器.为此,您需要知道哪些寄存器将存储系统调用的哪些参数.几个月前,我自己写了一个这样的节目.基本上
22 2023-11-08
编程技术问答社区
'strace'修复挂起的进程
我有一个单读unix进程,可以通过 tcp tcp > 问题是以下.当我启动该过程时,它将悬挂(没有繁忙的循环),直到我杀死它. 有趣的是,一旦我与 strace 以预期的行为运行,好像根本没有任何问题(总是可重复的). 这种行为的原因是什么? strace 对过程的状态有什么影响? 改变行为的原因是,因为我们将开孔负载与错误一起使用.一旦我们连接strace,堆栈就会回到内核,问题消失了. 解决方案 多年后,因此可能有一个完全不同的根本原因,此博客文章解释了为什么附加示踪剂可以修复悬挂系统的呼叫:https://ayende.com/blog/198849-C/production-postmortem-the -heisenbug-server?key = 1EEDA567-02A8-4BBBBBBB90F-557523973233 .看起来像运行strace(或使用ptrace系统调用的任何其他工具)可能会导致"悬挂"系统调用返回(带有EINTR的退出代
20 2023-11-08
编程技术问答社区
使用strace修复了挂起的内存问题
我有一个在Rhel6.x(64bit)上运行的多线程过程. 我发现,当我尝试提出该过程时,该过程挂起,并且(相同过程)的某些线程(相同的过程)崩溃.有些线程等待创建线程之间的共享内存(我可以看到所有这些都不会创建它). 但是,当我使用strace时,该过程不会悬挂,并且可以正常工作(所有应该创建的内存,都会创建).甚至在创建内存后打断strace,使过程保持正常. 我读过: strace修复悬挂过程 确实给了我一个主意.但是我仍然不清楚他们使用的RHEL版本. 另外,另一点是,将内核更改为fedora(兼容)内核没有产生问题. 所以,我想知道Strace究竟如何影响一个过程? (或者只是链接中指出的堆栈,然后移回内核)? 解决方案 最有可能的原因是,strace使用ptrace设施拦截系统调用,会影响您申请的时机,这是由于所涉及的每个系统调用的时间. 考虑一个并行两个线程的方案,其中线程A初始化了一个全局变量,而线程B访问该变量,而无需
26 2023-11-08
编程技术问答社区