嵌入式调试经验分享

12 篇文章 1 订阅
6 篇文章 0 订阅
syscall(SYS_gettid)/getpid()                  获取当前线程/进程号

strace -tt -T -p tid/pid                      获取当前线程/进程运行的系统调用

得到的结果可能为:

ioctl(237, xxx, xxx)

futex(0x11f4374, xxx, xxx)

通过系统调用中第一个参数,可以知道锁的地址或者ioctl的fd等

typedef union
{
  struct __pthread_mutex_s
  {
    int __lock;
    unsigned int __count;
    int __owner;
#if __WORDSIZE == 64
    unsigned int __nusers;
#endif
    /* KIND must stay at this position in the structure to maintain
       binary compatibility.  */
    int __kind;
#if __WORDSIZE == 64
    int __spins;
    __pthread_list_t __list;
# define __PTHREAD_MUTEX_HAVE_PREV      1
#else
    unsigned int __nusers;
    __extension__ union
    {
      int __spins;
      __pthread_slist_t __list;
    };
#endif
  } __data;
  char __size[__SIZEOF_PTHREAD_MUTEX_T];
  long int __align;
} pthread_mutex_t;

当是线程锁时,若知道了锁的地址,即__lock的地址(如0x11f4374),往后+8,即偏移两个int(一个int四个字节),即可得到__owner的地址(如0x11f437c),然后关掉程序的软狗和硬狗,使用gdb调试主进程(如test_strace,首先使用ps得到test_strace的进程号,如1230):

./gdb -p 1230

使用

p *(int *)0x11f437c

得到__owner的线程/进程号(如1298),使用

cat /proc/1230/task/1298/status

可以看到当前线程/进程信息

继续使用

strace -tt -T -p tid/pid

看当前线程还在等待什么锁,一层层往下分析,找到源头

修改时,很可能是某个退出的地方未释放锁导致的,想清楚修改即可。

 

当是ioctl时,若知道了fd(如237)和并通过ps命令知道主进程test_strace的pid(如1230),则可使用

ls -l /proc/1230/fd/237

得到这个fd所对应的文件,如/dev/vo,便可定位出是大致哪里出的问题。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值