操作系统:GNU/Linux发行版
:OpenSuSe 13.1
Arch:x86-64
GDB版本:7.6.50.20130731-cvs
程序语言:主要是带有少量汇编的C语言
想象一下,我有一个相当大的程序,有时无法打开文件.是否可以在GDB中设置断点,使其在open(2)syscall返回-1 后停止?
当然,我可以通过源代码查找并查找所有open(2)调用并缩小错误open()调用,但也许有更好的方法.
我试图用"catch syscall open"然后"condition N if $rax==-1"但显然它并没有被击中.
顺便说一句,是否可以区分对系统调用(例如open(2))的调用和从open(2)GDB中的系统调用(例如)返回?
作为当前的解决方法,我执行以下操作:
从另一个终端启动systemtap脚本:
stap -g -v -e 'probe process("PATH to the program run under GDB").syscall.return { if( $syscall == 2 && $return <0) raise(%{ SIGSTOP %}) }'
Run Code Online (Sandbox Code Playgroud)open(2)返回-1我收到SIGSTOP在GDB会话,我可以调试问题.TIA.
最好的问候,
亚历克斯.
UPD:即使我之前尝试过nm建议的方法并且无法使其工作,我还是决定再试一次.2小时后,它现在按预期工作.但有一些奇怪的解决方法:
如果我使用finishin comm我无法使用continue,根据GDB文档即可,
即以下内容确实会在每次中断时降至gdb提示符:
gdb> comm
gdb> finish …Run Code Online (Sandbox Code Playgroud)我有一个应用程序,我想知道在各种活动中花了多少时间.由于这个应用程序是I/O密集型的,我想得到一个报告,总结每个库/系统调用(挂起时间)花费了多少时间.
我尝试过oprofile,但似乎它给出了Unhalted CPU周期的时间(那就是cputime,而不是实时)
我已经尝试了strace -T,它给出了墙上的时间,但是生成的数据很大并且很难获得摘要报告(并且存在awk/py脚本?)
现在我正在寻找SystemTap,但我找不到任何足够接近且可以修改的脚本,现场教程也没有多大帮助.我不确定我能找到的是什么.
我需要有人指出我正确的方向.非常感谢!
我的系统是Ubuntu , uname -r = 4.15.0-23-generic. 我已经为内核安装了调试符号.
我的问题是:
我正在尝试
socket(AF_PACKET, SOCK_DGRAM, 0)用于传输目的.对于sendto(fd, 0,0,0,0,0)系统调用我有EINVAL(无效参数),我试图调查原因是什么.
因此,要找出EINVAL我使用SystemTap 返回的内容.下面的脚本按tpacket_snd功能语句跟踪执行语句.
我的探测程序:info.stp
probe kernel.statement("tpacket_snd@*:*") {
tokenize(pp(),"@");
printf("HIT %s\n", tokenize("","@"))
}
Run Code Online (Sandbox Code Playgroud)
以下是sudo stap info.stp我实现这种传输的输出:
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2619")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2627")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2628")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2636")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2638")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2640")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2641")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2656")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2659")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2658")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2662")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2663")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2669")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2671")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2674")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2672")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2675")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2680")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2688")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2692")
HIT …Run Code Online (Sandbox Code Playgroud) Systemtap是否支持PPC32?我看到有人提到它在英特尔和PPC64平台上得到支持,但没有太多关于PPC32的信息.
此外,SystemTap可以用于调试自定义的可加载内核模块吗?
谢谢,Sethu
如何使用ftrace()(或其他任何东西)跟踪Linux内核中特定的用户定义函数?我正在尝试创建和运行一些微基准测试,所以我希望有时间运行某些功能.我已经阅读了(至少尽可能多的)文档,但朝着正确方向迈出的一步将是非常棒的.
我倾向于ftrace(),但在Ubuntu 14.04上有问题.
我有 2 个实验环境:CentOS 6.8 和 Ubuntu 16.04 都在 Virtualbox VM 中运行。
在 CentOS 上我安装了
yum install kernel-devel kernel-debug
Run Code Online (Sandbox Code Playgroud)
在 Ubuntu 上我安装了:
sudo apt-get install linux-headers-$(uname -r)
sudo apt-get install fakeroot build-essential crash kexec-tools makedumpfile kernel-wedge
Run Code Online (Sandbox Code Playgroud)
在两个系统上我都可以成功运行:
stap -ve 'probe begin { log("hello world") exit() }'
Run Code Online (Sandbox Code Playgroud)
我.stp从systemtap指南中尝试了这个脚本:
#!/usr/bin/stap
probe begin
{
log("begin probe")
}
probe syscall.open
{
printf("%s(%d) open (%s)\n",execname(),pid(),argstr)
}
probe timer.ms(4000)#4s later
{
exit()
}
probe end
{
log("end probe")
}
Run Code Online (Sandbox Code Playgroud)
chmod +x ...脚本并以 …
谁能告诉我如何列出系统中当前的活动systemtap探针?
我想可能会有一些来自“ / proc”的信息。
在systemtap中检查用户空间应用程序的局部变量时遇到了问题.
我写了一个test.c,如下所示:
#include <stdio.h>
int func(int *p, int val)
{
printf("p=%p val=%d\n", p, val);
return 1;
}
int main()
{
int a = 7;
func(&a, a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
并用它编译 -g
# gcc -g -o test test.c
Run Code Online (Sandbox Code Playgroud)
Systemtap可以看到变量func():p和val
# stap -L 'process("./test").function("func")'
process("/home/ryan/Public/test").function("func@/home/ryan/Public/test.c:3") $p:int* $val:int
Run Code Online (Sandbox Code Playgroud)
所以我使用这个stp来观察变量:
# stap -e 'probe process("./test").function("func") {printf("%s(%p, %d)\n", probefunc(), $p, $val)}'
Run Code Online (Sandbox Code Playgroud)
但是当测试程序执行时,局部变量在结果中是不正确的,它显示:
func(0x0, 0)
Run Code Online (Sandbox Code Playgroud)
我正在使用fedora19:
kernel-3.11.9-200.fc19.x86_64
systemtap-sdt-devel-2.3-1.fc19.x86_64
systemtap-2.3-1.fc19.x86_64
systemtap-client-2.3-1.fc19.x86_64
systemtap-devel-2.3-1.fc19.x86_64
systemtap-runtime-2.3-1.fc19.x86_64
gcc-4.8.2-7.fc19.x86_64
Run Code Online (Sandbox Code Playgroud)
有人可以解决这个问题或给我一个解决方案吗?
我有一个在 aws ubuntu 实例上运行的 node.js 应用程序。我试图生成火焰图dtrace,linux perf tools但它们似乎都不起作用。这些是我遵循的步骤:
linux性能工具:https : //www.carlhopf.com/blog/2016/09/11/nodejs-cpu-profiling-production/
dtrace: https://nodejs.org/en/blog/uncategorized/profiling-node-js/
我已经--prof / --perf_basic_prof_only_functions为 linux perf 工具命令添加了启动应用程序的同时。
我从 dtrace stacks.out 文件得到的输出是:
CPU ID FUNCTION:NAME
0 330511 :tick-60s
Run Code Online (Sandbox Code Playgroud)
安装dtrace如下:https : //askubuntu.com/questions/60940/how-do-i-install-dtrace
当我尝试将 linux perf 命令的输出转换为火焰图时得到的输出是
ERROR: No stack counts found
Run Code Online (Sandbox Code Playgroud)
我不确定缺少什么以及为什么没有记录堆栈跟踪。
node version: 8.4.0
ubuntu : 14.04
我确实看到有Systemtap可用选项并且可以使用此命令:
stap -s 32 -D MAXBACKTRACE=100 -D MAXSTRINGLEN=4096 -D MAXMAPENTRIES=10240 \
-D MAXACTION=10000 -D STP_OVERLOAD_THRESHOLD=5000000000 --all-modules \
-ve 'global s; …Run Code Online (Sandbox Code Playgroud) 我正在寻找方法来了解进程或线程花时间等待的系统调用或子系统,即阻塞而不是安排在 CPU 上运行。
具体来说,如果我有一些未知的过程,或者一个我们只知道“它很慢”的过程,我希望能够学习以下内容:
sys_write()fd 13 上,即 /some/file”换句话说,当我的程序不在 CPU 上运行时,它在做什么?
这是一个惊人很难与回答perf,因为它不会出现有任何方式的记录系统调用从sys_enter持续时间sys_exit或以其他方式跟踪多久的事件。大概是由于其采样性质。
我知道一些针对 Linux 4.6 及更高版本的 eBPF 的实验性工作可能会有所帮助,Brendan Gregg 的off-cpu 工作。但在悲惨的运维世界中,支持 4.6 内核的独角兽却是难得一见的珍贵。
现实世界的选择是什么?
ftrace、systemtap 等在这里提供任何见解吗?