通过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);
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据你提供的错误信息"4605 [Vue warn]: Error in created hook: "RangeError: Maximum call stack size exceeded",这是一个Vue框架的错误。这个错误通常是由于在Vue组件的created钩子函数中发生了无限递归调用,导致调用栈溢出的错误。造成这个错误的原因可能有以下几种情况: 1. 组件内部的逻辑错误:在created钩子函数中,你可能在某个地方无意中调用了当前组件自身或其他组件,从而导致了无限递归调用。你可以检查一下created钩子函数内部的代码,看看是否有递归调用的情况。 2. 组件间的循环依赖:如果你的组件之间存在循环的依赖关系,即A组件依赖于B组件,同时B组件又依赖于A组件,那么在创建过程中就会出现无限递归的情况,从而导致调用栈溢出。你可以检查一下你的组件之间的依赖关系,看看是否存在循环依赖的情况。 3. 异步操作的错误使用:如果在created钩子函数中进行了异步操作(例如发送请求或者订阅事件),并且没有正确处理回调函数或者取消订阅,就有可能导致无限递归调用,从而引发这个错误。你可以检查一下异步操作的代码,看看是否有错误的使用方式。 针对这个错误,你可以尝试以下的解决方法: 1. 检查你的组件代码,特别是created钩子函数中的逻辑,确保没有发生无限递归调用的情况。 2. 检查你的组件之间的依赖关系,避免出现循环依赖的情况。 3. 如果在created钩子函数中进行了异步操作,确保正确处理回调函数或者取消订阅,以避免无限递归调用。 4. 如果以上方法都没有解决问题,你可以尝试使用Vue开发者工具来进行调试,查看具体的调用栈信息,以便更好地定位问题所在。 希望这些信息可以帮助你解决问题。如果还有其他疑问,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值