草庐IT

PTRACE_ATTACH

全部标签

linux - ptrace 能否判断 x86 系统调用使用的是 64 位还是 32 位 ABI?

我正在尝试使用ptrace来跟踪由单独进程进行的所有系统调用,无论是32位(IA-32)还是64位(x86-64)。我的跟踪器将在启用IA-32仿真的64位x86安装上运行,但理想情况下能够跟踪64位和32位应用程序,包括64位应用程序是否fork并执行32位进程.问题是,由于32位和64位系统调用编号不同,我需要知道进程是32位还是64位以确定它使用了哪个系统调用,即使我有系统调用编号。好像有imperfectmethods,比如检查/proc//exec或者(像strace那样)寄存器结构的大小,但没有什么可靠的。使问题复杂化的是64位进程可以switchoutoflongmode

linux - ptrace 能否判断 x86 系统调用使用的是 64 位还是 32 位 ABI?

我正在尝试使用ptrace来跟踪由单独进程进行的所有系统调用,无论是32位(IA-32)还是64位(x86-64)。我的跟踪器将在启用IA-32仿真的64位x86安装上运行,但理想情况下能够跟踪64位和32位应用程序,包括64位应用程序是否fork并执行32位进程.问题是,由于32位和64位系统调用编号不同,我需要知道进程是32位还是64位以确定它使用了哪个系统调用,即使我有系统调用编号。好像有imperfectmethods,比如检查/proc//exec或者(像strace那样)寄存器结构的大小,但没有什么可靠的。使问题复杂化的是64位进程可以switchoutoflongmode

linux - 如何仅使用 ptrace (linux, x86/x86_64) 获取 "backtrace"(如 gdb)

我想像gdb一样得到类似backtrace的输出。但我想通过ptrace()直接执行此操作。我的平台是Linux,x86;以及后来的x86_64。现在我只想从堆栈中读取返回地址,而不转换为符号名称。所以,对于测试程序,通过gcc-4.5以-O0方式编译:intg(){kill(getpid(),SIGALRM);}intf(){inta;intb;a=g();b=a;returna+b;}inte(){intc;c=f();}main(){returne();}我将启动一个我的程序,并在一开始就连接ptrace来测试程序。然后,我将执行PTRACE_CONT并等待信号。测试程序何时会进

linux - 如何仅使用 ptrace (linux, x86/x86_64) 获取 "backtrace"(如 gdb)

我想像gdb一样得到类似backtrace的输出。但我想通过ptrace()直接执行此操作。我的平台是Linux,x86;以及后来的x86_64。现在我只想从堆栈中读取返回地址,而不转换为符号名称。所以,对于测试程序,通过gcc-4.5以-O0方式编译:intg(){kill(getpid(),SIGALRM);}intf(){inta;intb;a=g();b=a;returna+b;}inte(){intc;c=f();}main(){returne();}我将启动一个我的程序,并在一开始就连接ptrace来测试程序。然后,我将执行PTRACE_CONT并等待信号。测试程序何时会进

c - 为什么这个 ptrace 程序说系统调用返回了 -38?

与thisone相同除了我正在运行execl("/bin/ls","ls",NULL);。结果显然是错误的,因为每个系统调用都返回-38:[user@test]#./test_tracesyscall59calledwithrdi(0),rsi(0),rdx(0)syscall12returnedwith-38syscall12calledwithrdi(0),rsi(0),rdx(140737288485480)syscall9returnedwith-38syscall9calledwithrdi(0),rsi(4096),rdx(3)syscall9returnedwith-38

c - 为什么这个 ptrace 程序说系统调用返回了 -38?

与thisone相同除了我正在运行execl("/bin/ls","ls",NULL);。结果显然是错误的,因为每个系统调用都返回-38:[user@test]#./test_tracesyscall59calledwithrdi(0),rsi(0),rdx(0)syscall12returnedwith-38syscall12calledwithrdi(0),rsi(0),rdx(140737288485480)syscall9returnedwith-38syscall9calledwithrdi(0),rsi(4096),rdx(3)syscall9returnedwith-38

c++ - `libusb_attach_kernel_driver` 不工作

我在完全关闭使用libusb的Linux应用程序时遇到问题(内核不回收接口(interface)):intrc;rc=libusb_reset_device(handle_);if(rc问题是重新附加内核驱动程序不起作用。实际上libusb_kernel_driver_active不会返回1,但即使我将其注释掉并始终调用libusb_attach_kernel_driver,我也永远不会取回我的/dev/ttyACM0设备。在这种情况下,我得到LIBUSB_ERROR_NOT_FOUND。 最佳答案 我已经调试了linuxcdc-a

c++ - `libusb_attach_kernel_driver` 不工作

我在完全关闭使用libusb的Linux应用程序时遇到问题(内核不回收接口(interface)):intrc;rc=libusb_reset_device(handle_);if(rc问题是重新附加内核驱动程序不起作用。实际上libusb_kernel_driver_active不会返回1,但即使我将其注释掉并始终调用libusb_attach_kernel_driver,我也永远不会取回我的/dev/ttyACM0设备。在这种情况下,我得到LIBUSB_ERROR_NOT_FOUND。 最佳答案 我已经调试了linuxcdc-a

在 ptraced Linux 进程中调用 ptrace

有人添加到Wikipedia"ptrace"article声称在Linux上,一个ptraced进程本身不能ptrace另一个进程。我正在尝试确定是否(如果是,为什么)是这种情况。下面是我设计的一个简单程序来测试它。我的程序失败(sub子进程未正常运行)但我非常确信这是我的错误,而不是根本性的错误。本质上,初始进程Afork进程B,后者又forkC。A追踪它的childB,B追踪它的childC。设置完成后,所有三个进程都被编写为仅每秒打印一次A、B或C到标准输出。在实践中,A和B工作正常,但C只打印一次,然后就卡住了。使用ps-eopid,cmd,wchan检查显示C卡在内核函数pt

在 ptraced Linux 进程中调用 ptrace

有人添加到Wikipedia"ptrace"article声称在Linux上,一个ptraced进程本身不能ptrace另一个进程。我正在尝试确定是否(如果是,为什么)是这种情况。下面是我设计的一个简单程序来测试它。我的程序失败(sub子进程未正常运行)但我非常确信这是我的错误,而不是根本性的错误。本质上,初始进程Afork进程B,后者又forkC。A追踪它的childB,B追踪它的childC。设置完成后,所有三个进程都被编写为仅每秒打印一次A、B或C到标准输出。在实践中,A和B工作正常,但C只打印一次,然后就卡住了。使用ps-eopid,cmd,wchan检查显示C卡在内核函数pt