转载_Linux 下用 strace 命令调试程序

  前几天在运行自己的程序时发现,在终端直接运行时,用 top 命令查看,一切正常,但处于程序是放在远程的,这样若本公司网络出现问题,此程序就关闭了,所以才想到让程序在后台运行更好。接下来我用了 nohup ./test.exe >&  aa.txt &    命令后,再用 top 一看吓一跳,CPU居然占了 百分之一百多呀!这是什么原因呢? 再用 pidstat 命令查看, sys占了大半CPU,usr 占了小部分。继续追踪下去,我在网上查看了一番。终于找到一个  strace 这条命令,用于调试程序。

接下来我就  strace nohup ./test.exe   追踪发现了问题:

nanosleep({0, 10000000}, NULL)          = 0
fstat64(0, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbffd293c) = -1 ENOTTY (Inappropriate ioctl for device)
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7736000
read(0, 0xb7736000, 4096)               = -1 EBADF (Bad file descriptor)
read(0, 0xb7736000, 4096)               = -1 EBADF (Bad file descriptor)
read(0, 0xb7736000, 4096)               = -1 EBADF (Bad file descriptor)
read(0, 0xb7736000, 4096)               = -1 EBADF (Bad file descriptor)
read(0, 0xb7736000, 4096)               = -1 EBADF (Bad file descriptor)
read(0, 0xb7736000, 4096)               = -1 EBADF (Bad file descriptor)
read(0, 0xb7736000, 4096)               = -1 EBADF (Bad file descriptor)

当时,我想肯定是这里出错才出影响到后面的错误。跟着代码找下去终于发现问题出在

while(getchar()='q')
{
}

我想 getchar() 是获取 stdin 上的字符,目前代码是在后台运行,这样就会从后台调用相应的函数以及映射到前台的一个地址等等联想一大篇,后来我的解决办法就是通过 Linux 的 信号量来解决这个问题,因为 Linux 下都是通过信号量来做事的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值