• 通过WARN(1,“xxx“) 来确定code的flow和打印callstack


    如果在code中想要确定code 走的flow,可以通过WARN_ONCE(1, "123446");来进行,并且会打印出callstack。这里的1的话,表示条件成立,"123446" 表示一个标识符,这样在log中直接搜素"123446"就可以找到我们的log
    static inline int regmap_write(struct regmap *map, unsigned int reg,
                       unsigned int val)
    {
        WARN_ONCE(1, "regmap API is disabled");
        return -EINVAL;
    }

    WARN_ONCE 定义如下:可见最后会调用dump_stack 来打印stack

    #define WARN_ONCE(condition, format...)    ({            \
        static bool __section(.data.unlikely) __warned;        \
        int __ret_warn_once = !!(condition);            \
                                    \
        if (unlikely(__ret_warn_once && !__warned)) {        \
            __warned = true;                \
            WARN(1, format);                \
        }                            \
        unlikely(__ret_warn_once);                \
    })

    #ifndef WARN
    #define WARN(condition, format...) ({                        \
        int __ret_warn_on = !!(condition);                \
        if (unlikely(__ret_warn_on))                    \
            __WARN_printf(format);                    \
        unlikely(__ret_warn_on);                    \
    })
    #endif


    #define __WARN_printf(arg...)    warn_slowpath_fmt(__FILE__, __LINE__, arg)


    #ifdef WANT_WARN_ON_SLOWPATH
    void warn_slowpath_fmt(const char *file, int line, const char *fmt, ...)
    {
        struct warn_args args;

        args.fmt = fmt;
        va_start(args.args, fmt);
        __warn(file, line, __builtin_return_address(0), TAINT_WARN, NULL,
               &args);
        va_end(args.args);
    }


    void __warn(const char *file, int line, void *caller, unsigned taint,
            struct pt_regs *regs, struct warn_args *args)
    {
        disable_trace_on_warning();

        pr_warn("------------[ cut here ]------------\n");

        if (file)
            pr_warn("WARNING: CPU: %d PID: %d at %s:%d %pS\n",
                raw_smp_processor_id(), current->pid, file, line,
                caller);
        else
            pr_warn("WARNING: CPU: %d PID: %d at %pS\n",
                raw_smp_processor_id(), current->pid, caller);

        if (args)
            vprintk(args->fmt, args->args);

        if (panic_on_warn) {
            /*
             * This thread may hit another WARN() in the panic path.
             * Resetting this prevents additional WARN() from panicking the
             * system on this thread.  Other threads are blocked by the
             * panic_mutex in panic().
             */
            panic_on_warn = 0;
            panic("panic_on_warn set ...\n");
        }

        print_modules();

        if (regs)
            show_regs(regs);
        else
            dump_stack();

        print_oops_end_marker();

        /* Just a warning, don't kill lockdep. */
        add_taint(taint, LOCKDEP_STILL_OK);
    }

  • 相关阅读:
    如何用蓝牙实现无线定位(三)--本地定位显示
    Vue页面监听键盘按键的多种方法
    Zabbix
    调试-Debug
    观察者模式-对象间的联动
    ASO优化之关于iOS的A/B测试
    vue3.0项目实战系列文章 - 登录页面
    高德地图驾车导航避让点位
    【计算机网络】计算机网络、互联网、互连网、因特网、万维网
    【稳定性】揭秘团队快速排查问题的三字经,你学会了吗?
  • 原文地址:https://blog.csdn.net/m0_71272694/article/details/127865408