首页 > 其他分享 >记一次bug排除心得

记一次bug排除心得

时间:2024-01-31 09:37:40浏览次数:25  
标签:char ptr 排除 fgets kill 进程 input 心得 bug

问题背景

要做一个需求,大概是检测到某输入重启,于是写一个demo调试一下

c语言程序,交叉编译后在adb shell下运行

思路

用 am 命令直接重启

我们先手动验证一下,发现这个设备不支持am命令吗,遂排除
image

用 kill 命令杀掉进程,然后重新运行

  1. 写个demo,这个程序会循环等待输入,按q退出
void test_option()
{

}

int main(int argc, char **argv)
{
    int ret;
    char *sptr = NULL;
    while(1)
    {
        sptr = input_fgets("Please input option: \n");

        if(sptr[0] == 'q')
            return 0;

        else if (atoi(sptr) == 1)
            test_option();
    }
    return 0;
}
  1. 另开一个cmd窗口,打开adb shell,查询进程号并杀掉重开
    image
    可以看到,通过另一个adb窗口可以很轻易地kill掉进程并重启
    那么 直接用system函数写入命令行执行不就完事了?? ,我也是这么认为的。。。但是出问题了!!!
  • 我手动执行ps看进程号,但是写程序获得进程号呢?
    ps | grep nwy_data_test | awk '{print $1}' | head -n 1
    这句命令表示取出ps结果的第一列的第一行并打印!也就是上图中的22122

  • 取到22122了,怎么传给命令行呢?

image

发现会无限循环执行!!!

image

  1. 经过我的调试!!!发现问题出在input_fgets函数!!!
    kill当前进程 重启一个不带input_fgets函数的情况下,只会kill不会运行新程序
    kill当前进程 重启一个while里带input_fgets函数的情况下,不但会kill且会忽略input_fgets的阻塞!!
    也就是说 只要kill当前进程后,重启的进程带fgets这种获取命令行输入的都有错!!!
static inline char *input_fgets(char *msg, ...)
{
    static char ptr[130] = { 0 };
    va_list ap;

    va_start(ap, msg);
    vprintf(msg, ap);
    va_end(ap);
    memset(ptr, 0, sizeof(ptr));
    fgets(ptr, sizeof(ptr), stdin);
    if(strlen(ptr) > 0) {
        if('\n' == ptr[strlen(ptr) - 1]) {
            ptr[strlen(ptr) - 1] = '\0';
        }
    }
    return ptr;
}
  1. 通过打断点,发现错误大概率是由于kill的底层是通过fork创建一个子进程的,而子进程会关联到父进程的输入输出流,通过kill杀掉的进程,影响了正常的输入输出流!!!

  2. 为了验证我的猜想,我编写了如下程序

原始进程rst_test
image

后来进程ftp_test 请忽略名字,,我懒得改了

用 exit 命令退出adb shell,然后重新开启

根因分析

困难总结

  1. kill进程之后,后面的指令不会继续运行了

  2. 程序内有while的话 脚本检测不到阻塞

最终方法

标签:char,ptr,排除,fgets,kill,进程,input,心得,bug
From: https://www.cnblogs.com/xsl-blogs/p/17996943

相关文章

  • Debug: mysql_real_connect failed: errno: , error
    [ERROR:mysql_real_connectfailed:errno:,error]kubectllogstransform-pod-name-nkubeflow-->INFO:absl:MetadataStorewithgRPCconnectioninitializedWARNING:absl:mlmdclientInternalError:mysql_real_connectfailed:errno:,error:ERROR:absl:......
  • 无涯教程-ExpressJS - Bug调试
    Express使用Debug模块记录有关路由匹配,中间件以及应用模式等信息。要查看Express中使用的所有内部日志,请在启动应用程序时将DEBUG环境变量设置为Express:*-DEBUG=express:*nodeindex.js将显示以下输出。当您的应用程序组件无法正常运行时,这些日志非常有用,您还可以将DEBU......
  • 影刀rpa:第二个项目学习心得
    教程有说到元素的关联操作,教程说自上而下的html路径,一时之间没弄清楚,索性就去看了下网页的html源码,才弄清楚到底是咋回事: 我是先选中了列表子元素的价格字段,选择两次以后就能选择到所有列表子元素的价格字段了: 我们点击编辑,可以看到以web开头的标签,x:name就是html标签的......
  • 通过 Windows 安全中心添加排除项:
    在Windows中设置排除项,即将特定的文件、文件夹或进程从WindowsDefender的扫描中排除,可以通过Windows安全中心来完成。以下是详细步骤:通过Windows安全中心添加排除项:打开Windows设置:按下Windows键+I,打开设置。进入更新与安全:在设置菜单中,选择“更新与安全......
  • 海康私有SDK打包jar运行错误排除
    我在用idea编译后运行正常,但是我想打包成为jar包后出现了一系列问题,我一一列举1.ant不存在到官网下载ant解压后配置环境变量即可2.[javac]警告:[options]未与-source5一起设置引导类路径[javac]错误:不再支持源选项5。请使用6或更高版本。[javac]错误:不再支持......
  • 前端奇怪bug日记02
    出现问题: 鼠标点哪里哪里就出现光标,找了一个多小时,发现并不是代码问题:    解决方案:按一下键盘F7即可解决。......
  • 生产环境出现 bug 自动生成异常追踪-SRE与开发自动化协同
    作者:观测云数据智能部产品方案架构师范莹莹简介生产环境bug的定义:RUM应用和APM应用的 error_stack 信息被捕捉后成为bug。以APM新增错误巡检为例,当出现新错误时,在观测云控制台的「事件」模块下生成新的事件报告,捕捉为bug。同时利用 DatafluxFunc 创建异常追踪,......
  • 15 个写代码的好习惯(可以减少 80% 非业务的 bug)
    引言作为一名刚入行的程序员,平时在编写代码时最好养成一些好习惯,这样可以避免或减少各种非业务的bug,从而提高开发效率,这里总结了常见的15个平时写代码的好习惯,希望对你有所帮助。1.修改完代码,记得自测一下「改完代码,自测一下」是每位程序员必备的基本素养。尤其不要抱有这......
  • webug4.0显错注入
    首先访问:http://192.168.195.139/control/sqlinject/manifest_error.php?id=1进入到这个靶场可以通过在url栏id=1处改数字、加单引号、#号、*号等等来判断注入点。如改成id=2,就会出现以下结果如果改成id=1)括号无反应,看来是屏蔽了id=1"双引号无反应id=1'单引号有结果,id=......
  • goland开启debug模式的修复
    1、使用下载的老版golandide工具,使用debug模式无法正常生效:异常信息是因为goland中的dlv.exe版本太老,也就是dlv.exe不能适配最新的go版本:errorlayer=debuggercouldnotpatchruntime.mallogc:notypeentryfound,use'types'foralistof2、处理方案:goinstallg......