console 订阅
console是一个英语单词,为动词、名词,作动词时意为“安慰;慰藉”。作名词时意为“[计] 控制台;[电] 操纵台;支撑架;人名;(意、罗)孔索莱 [1]  ”。 展开全文
console是一个英语单词,为动词、名词,作动词时意为“安慰;慰藉”。作名词时意为“[计] 控制台;[电] 操纵台;支撑架;人名;(意、罗)孔索莱 [1]  ”。
信息
外文名
console
词    性
动词、名词
console单词发音
英 [kən'səʊl] 美 ['kɑnsol] [1] 
收起全文
精华内容
下载资源
问答
  • 2019-07-11 15:32:15

    本文基于Linux-4.14

    1.earlycon

    early console,顾名思义,他表示的就是早期的console设备,主要用于在系统启动阶段的内核打印的输出,由于linux内核实际设备驱动模型还没有加载完成,所以早期的启动信息需要一个特殊的console用于输出log。

    在系统初始化时通过cmdline参数来解析,代码如下:

    
    ./init/main.c:
    
    static int __init do_early_param(char *param, char *val,
    
                     const char *unused, void *arg)
    
    {
    
        const struct obs_kernel_param *p;
    
    
    
        for (p = __setup_start; p < __setup_end; p++) {
    
            if ((p->early && parameq(param, p->str)) ||
    
                (strcmp(param, "console") == 0 &&
    
                 strcmp(p->str, "earlycon") == 0)
    
            ) {
    
                if (p->setup_func(val) != 0)
    
                    pr_warn("Malformed early option '%s'\n", param);
    
            }
    
        }
    
        /* We accept everything at this stage. */
    
        return 0;
    
    }
    
    
    
    void __init parse_early_options(char *cmdline)
    
    {
    
        parse_args("early options", cmdline, NULL, 0, 0, 0, NULL,
    
               do_early_param);
    
    }
    
    

    整个流程如下,系统启动阶段会读取cmdline,并且解析cmdline参数名字为earlycon的参数,然后执行do_early_param操作,其中的关键是调用p->setup_func,这个也就是earlycon驱动实现的内容,param_setup_earlycon函数:

    首先来看内核实现的earlycon驱动:

    
    ./drivers/tty/serial/earlycon.c:
    
    static int __init param_setup_earlycon(char *buf)
    
    {
    
        int err;
    
    
    
        /*
    
         * Just 'earlycon' is a valid param for devicetree earlycons;
    
         * don't generate a warning from parse_early_params() in that case
    
         */
    
        if (!buf || !buf[0]) {
    
            if (IS_ENABLED(CONFIG_ACPI_SPCR_TABLE)) {
    
                earlycon_init_is_deferred = true;
    
                return 0;
    
            } else if (!buf) {
    
                return early_init_dt_scan_chosen_stdout();
    
            }
    
        }
    
    
    
        err = setup_earlycon(buf);
    
        if (err == -ENOENT || err == -EALREADY)
    
            return 0;
    
        return err;
    
    }
    
    early_param("earlycon", param_setup_earlycon);
    
    

    上面的代码会创建一个如下结构体,用于和cmdline中的参数进行匹配:

    
    struct obs_kernel_param {
    
        const char *str;
    
        int (*setup_func)(char *);
    
        int early;
    
    };
    
    

    然后我们来看关键的setup实现param_setup_earlycon->setup_earlycon:

    
    ./drivers/tty/serial/earlycon.c:
    
    int __init setup_earlycon(char *buf)
    
    {
    
        const struct earlycon_id **p_match;
    
    
    
        if (!buf || !buf[0])
    
            return -EINVAL;
    
    
    
        if (early_con.flags & CON_ENABLED)
    
            return -EALREADY;
    
    
    
        for (p_match = __earlycon_table; p_match < __earlycon_table_end;
    
             p_match++) {
    
            const struct earlycon_id *match = *p_match;
    
            size_t len = strlen(match->name);
    
    
    
            if (strncmp(buf, match->name, len))
    
                continue;
    
    
    
            if (buf[len]) {
    
                if (buf[len] != ',')
    
                    continue;
    
                buf += len + 1;
    
            } else
    
                buf = NULL;
    
    
    
            return register_earlycon(buf, match);
    
        }
    
    
    
        return -ENOENT;
    
    }
    
    

    最后我们来看关键的setup实现setup_earlycon->register_earlycon:

    
    static int __init register_earlycon(char *buf, const struct earlycon_id *match)
    
    {
    
        int err;
    
        struct uart_port *port = &early_console_dev.port;
    
    
    
        /* On parsing error, pass the options buf to the setup function */
    
        if (buf && !parse_options(&early_console_dev, buf))
    
            buf = NULL;
    
    
    
        spin_lock_init(&port->lock);
    
        port->uartclk = BASE_BAUD * 16;
    
        if (port->mapbase)
    
            port->membase = earlycon_map(port->mapbase, 64);
    
    
    
        earlycon_init(&early_console_dev, match->name);
    
        err = match->setup(&early_console_dev, buf);
    
        if (err < 0)
    
            return err;
    
        if (!early_console_dev.con->write)
    
            return -ENODEV;
    
    
    
        register_console(early_console_dev.con);
    
        return 0;
    
    }
    
    

    最终会调用register_console注册printk输出对应的console。代码跟踪到这里,会发现以上的处理还都是内核的通用框架性代码,那么到底如何与实际的设备硬件对应起来呢?看上面的setup_earlycon中的match操作,实际上是通过查找__earlycon_table来匹配实际硬件的。可以看到以上的代码都是内核的通用代码,不需要开发人员再做处理的,但是对于驱动人员来说,必须要实现硬件驱动,也就是要把自己硬件相关的操作注册到__earlycon_table中。

    在include/linux/serial_core.h中定义了如下的宏定义来便于添加__earlycon_table:

    
    
    #define _OF_EARLYCON_DECLARE(_name, compat, fn, unique_id)      \
    
        static const struct earlycon_id unique_id           \
    
             EARLYCON_USED_OR_UNUSED __initconst            \
    
            = { .name = __stringify(_name),             \
    
                .compatible = compat,               \
    
                .setup = fn  };                 \
    
        static const struct earlycon_id EARLYCON_USED_OR_UNUSED     \
    
            __section(__earlycon_table)             \
    
            * const __PASTE(__p, unique_id) = &unique_id
    
    
    
    #define OF_EARLYCON_DECLARE(_name, compat, fn)              \
    
        _OF_EARLYCON_DECLARE(_name, compat, fn,             \
    
                     __UNIQUE_ID(__earlycon_##_name))
    
    

    2.console

    上面第一章节介绍early console,它是一种启动阶段前期的console,启动到后期会切换为real console。这两者都属于console,那么到底什么才是console呢?先看下内核的实现:

    
    void register_console(struct console *newcon)
    
    {
    
    	int i;
    
    	unsigned long flags;
    
    	struct console *bcon = NULL;
    
    	struct console_cmdline *c;
    
    	static bool has_preferred;
    
    
    
    	if (console_drivers)       //内核注册的所有console drivers,如果发现要注册的console已经被注册过了,直接return
    
    		for_each_console(bcon)
    
    			if (WARN(bcon == newcon,
    
    					"console '%s%d' already registered\n",
    
    					bcon->name, bcon->index))
    
    				return;
    
    
    
    	/*
    
    	 * before we register a new CON_BOOT console, make sure we don't
    
    	 * already have a valid console
    
    	 */
    
    	if (console_drivers && newcon->flags & CON_BOOT) { //如果real console已经注册过,那么boot console就不允许再被注册了
    
    		/* find the last or real console */
    
    		for_each_console(bcon) {
    
    			if (!(bcon->flags & CON_BOOT)) {
    
    				pr_info("Too late to register bootconsole %s%d\n",
    
    					newcon->name, newcon->index);
    
    				return;
    
    			}
    
    		}
    
    	}
    
    
    
    	if (console_drivers && console_drivers->flags & CON_BOOT) //是否已经注册过boot console
    
    		bcon = console_drivers;
    
    
    
    	if (!has_preferred || bcon || !console_drivers)
    
    		has_preferred = preferred_console >= 0; //如果real console还没有注册过,那么判断是否存在prefer console
    
    
    
    	/*
    
    	 *	See if we want to use this console driver. If we
    
    	 *	didn't select a console we take the first one
    
    	 *	that registers here.
    
    	 */
    
    	if (!has_preferred) { //如果不存在prefer console,那么把当前这个作为preferred console
    
    		if (newcon->index < 0)
    
    			newcon->index = 0;
    
    		if (newcon->setup == NULL ||
    
    		    newcon->setup(newcon, NULL) == 0) {
    
    			newcon->flags |= CON_ENABLED;
    
    			if (newcon->device) {
    
    				newcon->flags |= CON_CONSDEV;
    
    				has_preferred = true;
    
    			}
    
    		}
    
    	}
    
    
    
    	/*
    
    	 *	See if this console matches one we selected on
    
    	 *	the command line.
    
    	 */
    
    	for (i = 0, c = console_cmdline;
    
    	     i < MAX_CMDLINECONSOLES && c->name[0];
    
    	     i++, c++) {  //查找cmdline中传递的console配置项,如果发现匹配项,就根据cmdline传入的options执行setup操作(可能包含波特率等配置)
    
    		if (!newcon->match ||
    
    		    newcon->match(newcon, c->name, c->index, c->options) != 0) { //match函数为空或者match函数不匹配,那么执行默认match操作
    
    			/* default matching */
    
    			BUILD_BUG_ON(sizeof(c->name) != sizeof(newcon->name));
    
    			if (strcmp(c->name, newcon->name) != 0) //默认的match操作其实就是比较name字符串是否相同
    
    				continue;
    
    			if (newcon->index >= 0 &&
    
    			    newcon->index != c->index)
    
    				continue;
    
    if (newcon->index < 0)
    
    				newcon->index = c->index;
    
    
    
    			if (_braille_register_console(newcon, c))
    
    				return;
    
    
    
    			if (newcon->setup &&
    
    			    newcon->setup(newcon, c->options) != 0)
    
    				break;
    
    		}
    
    //执行到这里,说明match都已经成功了,直接enable console,并且把prefer设置为它
    
    		newcon->flags |= CON_ENABLED;
    
    		if (i == preferred_console) {
    
    			newcon->flags |= CON_CONSDEV;
    
    			has_preferred = true;
    
    		}
    
    		break;
    
    	}
    
    //执行到此,他的逻辑:
    
    //1.如果real console,只有match了cmdline中的配置,才会enable它,否则直接return。
    
    //2.如果是boot console,此时也是enable状态,那么也会继续运行到下面
    
    	if (!(newcon->flags & CON_ENABLED))
    
    		return;
    
    
    
    	/*
    
    	 * If we have a bootconsole, and are switching to a real console,
    
    	 * don't print everything out again, since when the boot console, and
    
    	 * the real console are the same physical device, it's annoying to
    
    	 * see the beginning boot messages twice
    
    	 */
    
    	if (bcon && ((newcon->flags & (CON_CONSDEV | CON_BOOT)) == CON_CONSDEV)) 
    
    //运行到此说明是从boot console到real console的切换,那么要注销所有的boot console
    
    		newcon->flags &= ~CON_PRINTBUFFER;
    
    
    
    	/*
    
    *	Put this console in the list - keep the
    
    	 *	preferred driver at the head of the list.
    
    	 */
    
    	console_lock();
    
    	if ((newcon->flags & CON_CONSDEV) || console_drivers == NULL) { //把对应的console driver加入到链表中,此链表在printk时会使用到
    
    		newcon->next = console_drivers;
    
    		console_drivers = newcon;
    
    		if (newcon->next)
    
    			newcon->next->flags &= ~CON_CONSDEV;
    
    	} else {
    
    		newcon->next = console_drivers->next;
    
    		console_drivers->next = newcon;
    
    	}
    
    
    
    	if (newcon->flags & CON_EXTENDED)
    
    		if (!nr_ext_console_drivers++)
    
    			pr_info("printk: continuation disabled due to ext consoles, expect more fragments in /dev/kmsg\n");
    
    
    
    	if (newcon->flags & CON_PRINTBUFFER) {
    
    		/*
    
    		 * console_unlock(); will print out the buffered messages
    
    		 * for us.
    
    		 */
    
    		logbuf_lock_irqsave(flags);
    
    		console_seq = syslog_seq;
    
    		console_idx = syslog_idx;
    
    		logbuf_unlock_irqrestore(flags);
    
    		/*
    
    		 * We're about to replay the log buffer.  Only do this to the
    
    		 * just-registered console to avoid excessive message spam to
    
    		 * the already-registered consoles.
    
    		 */
    
    		exclusive_console = newcon;
    
    	}
    
    	console_unlock();
    
    	console_sysfs_notify();
    
    
    
    	/*
    
    	 * By unregistering the bootconsoles after we enable the real console
    
    	 * we get the "console xxx enabled" message on all the consoles -
    
    	 * boot consoles, real consoles, etc - this is to ensure that end
    
    	 * users know there might be something in the kernel's log buffer that
    
    	 * went to the bootconsole (that they do not see on the real console)
    
    	 */
    
    	pr_info("%sconsole [%s%d] enabled\n",
    
    		(newcon->flags & CON_BOOT) ? "boot" : "" ,
    
    		newcon->name, newcon->index);
    
    	if (bcon &&
    
    	    ((newcon->flags & (CON_CONSDEV | CON_BOOT)) == CON_CONSDEV) &&
    
    	    !keep_bootcon) {
    
    		/* We need to iterate through all boot consoles, to make
    
    		 * sure we print everything out, before we unregister them.
    
    		 */
    
    		for_each_console(bcon)
    
    			if (bcon->flags & CON_BOOT)
    
    				unregister_console(bcon);
    
    	}
    
    }
    
    EXPORT_SYMBOL(register_console);
    
    

    不管是early console还是real console都是通过register_console注册到内核中的,如果它是early console,那么直接enable它,如果它是一个real console设备,那么要匹配cmdline中配置的“console=”配置,只有匹配了cmdline的console才会使能,使能后的real console会加入到统一管理的链表:console_drivers。 这里引申一个问题?如果我们要同时使能一个serial console和一个ram console,那么要怎么配置,实际上要在cmdline中配上两个cmdline console,传入cmdline时可以通过“,”分割即可。

    下面来看下cmdline参数是如何传入的:

    
    
    static int __add_preferred_console(char *name, int idx, char *options,
    
                       char *brl_options)
    
    {   
    
        struct console_cmdline *c;
    
        int i;
    
        
    
        /*
    
         *  See if this tty is not yet registered, and
    
         *  if we have a slot free.
    
         */ 
    
        for (i = 0, c = console_cmdline;
    
             i < MAX_CMDLINECONSOLES && c->name[0];
    
             i++, c++) {
    
            if (strcmp(c->name, name) == 0 && c->index == idx) {  //判断是否已经添加过此console,不再重复添加
    
                if (!brl_options)
    
                    preferred_console = i;
    
                return 0;
    
            }
    
        }
    
        if (i == MAX_CMDLINECONSOLES)
    
            return -E2BIG;
    
        if (!brl_options)
    
            preferred_console = i;
    
        strlcpy(c->name, name, sizeof(c->name)); //如果还没有加入到cmdline cosole数组,那么这里进行加入操作
    
        c->options = options;
    
        braille_set_options(c, brl_options);
    
        
    
        c->index = idx;
    
        return 0;
    
    }
    
    
    
    
    
    static int __init console_setup(char *str)
    
    {
    
        char buf[sizeof(console_cmdline[0].name) + 4]; /* 4 for "ttyS" */
    
        char *s, *options, *brl_options = NULL;
    
        int idx;
    
    
    
        if (_braille_console_setup(&str, &brl_options))  //这里是针对盲人console设备的操作,不在进一步跟进,感兴趣的自己去看
    
            return 1;
    
    
    
        /*
    
         * Decode str into name, index, options.
    
         */
    
        if (str[0] >= '0' && str[0] <= '9') {
    
            strcpy(buf, "ttyS");
    
            strncpy(buf + 4, str, sizeof(buf) - 5);
    
        } else { 
    
            strncpy(buf, str, sizeof(buf) - 1);
    
        }
    
        buf[sizeof(buf) - 1] = 0; 
    
        options = strchr(str, ',');
    
        if (options)
    
            *(options++) = 0;
    
    #ifdef __sparc__
    
        if (!strcmp(str, "ttya"))
    
            strcpy(buf, "ttyS0");
    
        if (!strcmp(str, "ttyb"))
    
            strcpy(buf, "ttyS1"); 
    
    #endif 
    
        for (s = buf; *s; s++) 
    
            if (isdigit(*s) || *s == ',')
    
                break;
    
        idx = simple_strtoul(s, NULL, 10);
    
        *s = 0;
    
    
    
        __add_preferred_console(buf, idx, options, brl_options); //加入到cmdline console数组
    
        console_set_on_cmdline = 1;
    
        return 1;
    
    }
    
    __setup("console=", console_setup);
    
    

    console_setup会把cmdline中的console参数解析并加入到一个数组中,在console_register时与这个数组中的console进行match操作,match成功才会enable使能它,并进行setup操作。

    3.printk

    console已经register注册成功了,那么printk的log是怎么输出到console的呢?

    
    printk->vprintk_emit:
    
    asmlinkage int vprintk_emit(int facility, int level,
    
                    const char *dict, size_t dictlen,
    
                    const char *fmt, va_list args)
    
    {
    
        int printed_len;
    
        bool in_sched = false;
    
        unsigned long flags;
    
    
    
        if (level == LOGLEVEL_SCHED) {
    
            level = LOGLEVEL_DEFAULT;
    
            in_sched = true;
    
        }
    
    
    
        boot_delay_msec(level);
    
        printk_delay();
    
    
    
        /* This stops the holder of console_sem just where we want him */
    
        logbuf_lock_irqsave(flags);
    
        printed_len = vprintk_store(facility, level, dict, dictlen, fmt, args);
    
        logbuf_unlock_irqrestore(flags);
    
    
    
        /* If called from the scheduler, we can not call up(). */
    
        if (!in_sched) {
    
            /*
    
             * Disable preemption to avoid being preempted while holding
    
             * console_sem which would prevent anyone from printing to
    
             * console
    
             */
    
            preempt_disable();
    
            /*
    
             * Try to acquire and then immediately release the console
    
             * semaphore.  The release will print out buffers and wake up
    
             * /dev/kmsg and syslog() users.
    
             */
    
            if (console_trylock())
    
                console_unlock();
    
            preempt_enable();
    
        }
    
    
    
        return printed_len;
    
    }
    
    EXPORT_SYMBOL(vprintk_emit);
    
    

    在每次printk中会执行一个console_unlock操作,它会触发console对外输出数据:

    
    console_unlock-->call_console_drivers:
    
    static void call_console_drivers(const char *ext_text, size_t ext_len,
    
                     const char *text, size_t len)
    
    {
    
        struct console *con;
    
    
    
        trace_console_rcuidle(text, len);
    
    
    
        if (!console_drivers)
    
            return;
    
    
    
        for_each_console(con) {
    
            if (exclusive_console && con != exclusive_console)
    
                continue;
    
            if (!(con->flags & CON_ENABLED))
    
                continue;
    
            if (!con->write)
    
                continue;
    
            if (!cpu_online(smp_processor_id()) &&
    
                !(con->flags & CON_ANYTIME))
    
                continue;
    
            if (con->flags & CON_EXTENDED)
    
                con->write(con, ext_text, ext_len);
    
            else
    
                con->write(con, text, len);
    
        }
    
    }
    
    

    call_console_drivers函数会遍历console driver并且输出logbuffer。

    3. real console

    上面介绍了这么多,都是内核核心框架的内容,那么如何跟实际的硬件联系在一起呢?驱动工程师要做些什么才能输出log到串口呢?遵循如下两步骤:

    • 先要注册对应的uart driver,其中会注册tty驱动

    uart_register_driver

    • 绑定一个port到指定的uart driver,其中会触发配置操作,如果这个设备指定配置为console,那么会执行register_console

    uart_add_one_port->uart_configure_port–>register_console

    更多相关内容
  • VMRC VMware Remote Console 10.0.2 for Windows

    热门讨论 2018-04-25 12:58:16
    VMRC VMware Remote Console 10.0.2 for Windows 虚拟机
  • console线驱动

    2014-11-11 10:46:24
    console线驱动,主要用于华为,思科交换机console调试用驱动,测试没问题
  • rocketmq web-console 管理界面war包

    热门讨论 2016-04-07 15:00:37
    rocketmq管理界面,下载发布到tomcat下,修改config.properties中的rocketmq.namesrv.addr参数即可。该参数为nameserver的地址
  • Console 3000字完整指南,让你不只会用console.log !

    万次阅读 多人点赞 2021-09-01 09:23:49
    笔者接触JS也不少时间了,除了用vscode的debuger,其实大部分时间都在使用console.log()方法来输出一些或者调试程序,我相信很多刚开始接触JS的同志,应该也都习惯使用console.log()。但是log的能力是有限的,并不能...

    创作不易,求一个免费的赞,谢谢啦 !!!

    image.png

    前言

    为啥会突然想起写一篇关于console的文章?笔者接触JS也不少时间了,除了用vscode的debuger,其实大部分时间都在使用console.log()方法来输出一些或者调试程序,我相信很多刚开始接触JS的同志,应该也都习惯使用console.log()。但是log的能力是有限的,并不能满足所有的场景。比如我们相用表格数据对象。

    下面这张图,纯粹是看了扫黑风暴想到的!!!

    console.log()

    大家最常用的应该就是这个属性了,不过你有没有使用这个方法输出console对象。

    console.log(console)
    

    语法

    console.log(常见JS数据)

    console.log(123)
    >> 123
    

    console.log( %s %d %f %o 等占位符写法(类似C的print))

    console.log('我是 %s','前端picker')
    >> 我是 前端picker
    

    console.log(ES6 模板字符串)

    const nickName = "前端picker"
    console.log(`我是 ${nickName}``)
    >> 我是 前端picker
    

    数组/对象会显示在一行

    console.log({object: 'object'}, {object: 'object'});
    console.log(['array', 'array'], ['array', 'array']);
    

    CSS样式美化输出

    在上面我们介绍了占位符输出,其实还有占位符%c,可以用来接收css样式。

    console.log('我是红色 %c 文字', 'color: red;');
    

    每个%c只负责它之后的文字,知道遇到下一个%c;

    console.log('This is %cred text %c 我没颜色 %c 我是绿色.', 'color: red;', '', 'color: green;');
    

    当然你也可以选择把样式定义成变量。

    let style="background: white;border: 3px solid red;color: red;font-size: 50px;margin: 40px;padding: 20px;"
    undefined
    console.log('%c我是log!', style);
    

    console.clear()

    大部分的浏览器在开发者工具都内置了清除控制条的方法。

    其实console对象也提供了clear方法来清空控制台。

    当你执行console.clear()之后

    cosole.debug()

    输出“调试”级别的消息,并且在浏览器中只有你配置了debug才可以显示。
    例如在火狐浏览器中:

    当你没有勾选调试的时候:是无法显示debug的信息的。


    只有你勾选调试的时候,才会显示。

    error()

    向 Web 控制台输出一条错误消息,并且只有才浏览器配置了errors才可以显示。

    下图是在火狐浏览器的效果

    下图是在chrome的效果

    两个浏览器都会在error的前面加上一个小图标。

    info()

    向web控制台输出一个通知信息,并且只有在浏览器配置info可见的时可以显示。
    下图是在火狐浏览器的效果

    下图是在chrome的效果

    在火狐浏览器中会在前面加上小图标,而chrome没有

    warn()

    向 Web 控制台输出一条警告信息,并且只有在浏览器配置warning可见的时可以显示。

    下图是在火狐浏览器的效果

    下图是在chrome的效果

    两个浏览器都会在warn的前面加上一个小图标。

    console.count()

    输出 count() 被调用的次数。此函数接受一个可选参数 label,如果你不设置参数的话,这个参数默认名叫**“default”**。

    用来统计

    console.count('我是');
    console.count('前端picker');
    console.count('我是');
    console.count('前端picker');
    console.count('我是');
    console.count('前端picker');
    

    通过下图可以看到,针对不同的参数,count()是分别累计的。

    console.countReset()

    用来重启计数器的.同样也接收一个label参数,


    如果提供了参数label,此函数会重置与label关联的计数。

    如果省略了参数label,此函数会重置默认的default计数器。

    console.dir()

    在控制台中显示指定JavaScript对象的属性,并通过类似文件树样式的交互列表显示。
    也就是语法是:

    console.dir(object)
    
    const auther = {
      name: '前端picker',
      age: '18',
    
    };
    
    console.log(auther);
    console.dir(auther);
    

    在chrome浏览器中,是支持这个属性的,下图可以看出与log的不同

    但是在火狐浏览器中,log和dir的输出一致,不同的是火狐会默认展开dir的结果。

    当然log和dir在输出dom结构的时候是完全不同的。不过这个我们放在dirxml方法中学习。

    console.dirxml()

    显示一个明确的XML/HTML元素的包括所有后代元素的交互树。 如果无法作为一个element被显示,那么会以JavaScript对象的形式作为替代。 它的输出是一个继承的扩展的节点列表,可以让你看到子节点的内容。

    同时也支持object。

    在dir中我们把DOM留到了这里。
    创建一个DOM对象

    var childNode = document.createElement('p');
    childNode.innerHTML = '<span>这里是提示信息〜〜</span>';
    

    使用log/dir/dirxml输出

    log


    dir

    dirxml

    可以看出log和dirxml的输出效果是一致的,是以DOM的形式输出的,dir则输出的是属性的值。

    group()、groupCollapsed() 和 groupEnd()

    将不同的控制台输出组合在一起以显示它们之间的一种关系形式。通常是组合在一起使用的。

    group接收一个参数,表示组名,如果不设置的话,在不同的浏览器表现不一致,浏览器默认展开组。

    groupCollapsed()与group的不同在于groupCollapsed会自动折叠组。

    groupEnd()表示组的结束。

    group+groupEnd

    console.group();
    console.log('name:');
    console.log('前端picker');
    console.groupEnd();
    
    console.group('参数');
    console.log('age');
    console.log('18');
    console.groupEnd();
    

    下面是chrome的效果。不设置组名的话,默认是console.group,同时一组的输出会缩进。

    下面是火狐的效果不设置组名的话,默认是<无组标签>

    groupCollapsed+grounEnd

    console.groupCollapsed();
    console.log('name:');
    console.log('前端picker');
    console.groupEnd();
    
    console.group('参数');
    console.log('age');
    console.log('18');
    console.groupEnd('参数');
    

    嵌套

    console.group('下面是作者信息');
    console.log('第1项');
    console.group('name');
    console.log('前端picker');
    console.groupEnd();
    console.log('第2项');
    console.group('age');
    console.log('18');
    console.groupEnd();
    console.groupEnd();
    

    CSS样式美化-%c

    console.group('%c下面是作者信息','color:red;');
    console.log('第1项');
    console.group('name');
    console.log('前端picker');
    console.groupEnd();
    console.log('第2项');
    console.group('age');
    console.log('18');
    console.groupEnd();
    console.groupEnd();
    

    console.table()

    这个方法需要一个必须参数,参数 必须是一个数组或者是一个对象;还可以使用一个可选参数 columns。

    它会参数以表格的形式打印出来。数组中的每一个元素(或对象中可枚举的属性)将会以行的形式显示在表格中。

    表格的第一列是 index。如果数据 data 是一个数组,那么这一列的单元格的值就是数组的索引。 如果数据是一个对象。

    数组

    let ary = [
      '1',
      '2',
      '3'
    ];
    console.table(ary);
    

    object对象

    let obj = {
      name: '前端picker',
      age: '18',
    };
    console.table(obj);
    

    对象数组

    let aryOfObjects = [
      {
        name: '张三',
        age: '12',
    
      },
      {
        name: '李四',
        age: '18',
    
      },
      {
        name: '王五',
        age: '19',
      }
    ];
    console.table(aryOfObjects);
    

    如图所示,table()为我们提供了一个很好的对象布局,其中重复键作为列标签。,每个对象中的所有键都将表示为一列,无论其他对象中是否有对应的键与数据。如果对象没有键列的数据,则它显示为空。

    数组数组

    let aryOfArray = [
    [1,2,3],[3,4,5],[6,7,8]
    ];
    console.table(aryOfArray);
    

    数组数组类似于对象数组。它使用内部数组的索引作为列标签,而不是作为列标签的键。因此,如果一个数组的项目数比其他数组多,那么这些列的表中将有空白项目。就像对象数组一样。

    对象数组数组

    let aryOfArraysWithObject = [
      ['1', '2',  {
        name: '张三',
        age: '12',
    
      },],
      ['3', '4',  {
        name: '李四',
        age: '18',
    
      },}],
      ['5', '6',  {
        name: '王五',
        age: '19',
      }]
    ];
    
    console.table(aryOfArraysWithObject);
    

    在Chrome中,要查看第三列中这些对象中包含的内容,是无法展开的,也就是无法查看。。


    不过在火狐浏览器中,会自动展开,可以清除的看到结果

    time()、timeLog() 和 timeEnd()

    time()

    你可以启动一个计时器来跟踪某一个操作的占用时长。每一个计时器必须拥有唯一的名字,页面中最多能同时运行10,000个计时器。当以此计时器名字为参数调用 console.timeEnd() 时,浏览器将以毫秒为单位,输出对应计时器所经过的时间。

    console.time(计时器名称)
    

    timeEnd()

    停止一个通过 console.time() 启动的计时器,并并输出结束的时间

    console.timeEnd(计时器名称)
    

    timeLog()

    在控制台输出计时器的值,该计时器必须已经通过 console.time() 启动。

    console.timeLog()(计时器名称)
    

    使用

    console.time('this is a timer');
    console.timeLog('this is a timer');
    console.timeEnd('this is a timer');
    

    计算for的时间

    console.time('this is a timer');
    for(let  i=0; i<10000000;i++){
        
    }
    console.timeLog('this is a timer');
    console.timeEnd('this is a timer');
    

    console.assert()

    console.assert()命令类似于前面提到的错误命令。不同之处在于断言允许使用布尔条件来确定是否应该将文本输出到控制台。

    例如:你想测试一个变量的值,并且这个值不等于’前端picker’,
    如果变量低于该数字并且条件解析为 true,则 assert 命令不执行任何操作。如果条件解析为 false,则显示输出文本。通过这种方式,你就不需要通过if判断是不是需要输出之后,再使用console.error()输出。

    let name = '张三';
    console.assert(name === '前端picker', '不是是前端picker,无法输出');
    let name1 = '前端picker';
    console.assert(name1 === '前端picker', '不是前端picker------1,可以输出');
    

    在Chrome中, 还可以输出显示断言来自何处。

    let value = 2;
    function chackValue() {
        chackValue3();
    }
    function chackValue2() {
        chackValue3();
    }
    function chackValue3() {
      console.assert(value < 1, 'This was false.');
    }
    chackValue();
    

    为了方便看,我们使用vscode标注了行数。

    通过下图可以看出,Chrome告诉我们断言在9行。

    console.trace

    调用堆栈

    在学习trace之前我们先来学习什么是调用堆栈!!!
    有这样四个函数 function1调用function2 ,function2调用function3,function3调用function4
    看这张图,这几个函数呈现出堆栈的特征。最后被调用的函数出现在最上方。因此称呼这种关系为调用堆栈(call stack)。
    image.png

    trace可以干啥

    用来记录 JavaScript 堆栈跟踪,同时我们还还可以添加参数,用来表示当前跟踪的名册灰姑娘。

    function f1(){
         console.log('f1')
         f2()
    }
    function f2(){
         console.log('f2')
         f3()
    }
    function f3(){
         console.log('f3')
         f4()
    }
    function f4(){
         console.log('f4')
         console.trace("f4的追踪记录");
    }
    

    从图中我们可以看到:触发 console.trace 之前调用的最后一个函数是f4。所以这将是调用堆栈的顶部。然后一次是f3,f2 ,f1
    image.png

    展开全文
  • Lucida Console 字体 (编程字体 内附Lucida Sans)

    千次下载 热门讨论 2014-07-29 11:40:56
    曾经有个段子说的是,一眼能认出黑客的原因就是因为对方在使用黑屏荧光字加Lucida Console 其实这正说明了Lucida Console在终端使用的受欢迎程度。 Lucida Console也是英文版Windows XP和Windows CE中蓝屏死机和...
  • 浏览器上有趣的Console命令都了解吗?

    千次阅读 多人点赞 2021-06-02 00:06:08
    作为用过JavaScript的各位来说,一定都知道使用console.log输出信息吧 (不知道也没关系 ) 不过对于console,各位都了解全了吗? 上手操作 按下F12键,就会出现浏览器上控制台了,如下图 这里我使用的是Chrome...

    作为用过JavaScript的各位来说,一定都知道使用console.log输出信息吧 (不知道也没关系

    不过对于console,各位都了解全了吗?
    在这里插入图片描述



    上手操作

    按下F12键,就会出现浏览器上控制台了,如下图
    这里我使用的是Chrome浏览器,不同浏览器控制台可能会有所不同
    在这里插入图片描述


    接下来让我们使用一下console.log打印一下信息,看看效果

    111被直接打印了出来,arr因为未定义,所以报错了

    在这里插入图片描述




    常用console命令

    console的命令有很多,并不局限于我们常用的log日志命令

    MDN参考:https://developer.mozilla.org/zh-CN/docs/Web/API/Console

    console的命令很多,本次也只会挑几个有意思的来说一下
    在这里插入图片描述


    打印信息命令

    接下来先说说console.log的几个兄弟 info() 、debug()、warn()、error()

    命令功能
    infoconsole.logの别名,输出信息,不过在一些浏览器中会有前面会有感叹号小标识,如下chrome无区别,火狐有区别
    测试命令: console.log('console log') console.info('console info')

    在这里插入图片描述 在这里插入图片描述
    debug也是打印信息,仅仅控制台配置为显示调试输出时才显示该消息。在chrome中可能因为日志级别打印不出来,但是火狐可以
    测试命令: console.debug("console debug")

    在这里插入图片描述
    warn前面加上了警告标识符,打印出来的信息变成了警告信息样式
    测试命令: console.warn("console warn")

    在这里插入图片描述
    error前面加上了错误标识符,打印出来的信息变成了错误信息样式
    测试命令: console.error("console error")
    在这里插入图片描述

    下面在火狐浏览器中测试的:

    console.log('console log')   
    console.info('console info')
    console.debug("console debug")
    console.warn("console warn")
    console.error("console error")
    

    在这里插入图片描述


    count打印调用的次数

    输出count()被调用的次数。此函数接受一个可选参数 label
    如果提供了label,则此函数记录调用带有此特定label的count()的次数

    测试代码:

    for (var i = 0; i < 5; i++)
    {
    	console.count("key")
    }
    

    在这里插入图片描述

    注意了,在这里会发现神奇的一点,每次重新运行测试代码,但是count计算的次数是不会被重置的

    所以你可能会需要一句console.countReset(),来重置count
    countReset是重置计数器。此函数有一个可选参数 label。

    console.countReset("key");
    for (var i = 0; i < 5; i++)
    {
    	console.count("key")
    }
    

    在这里插入图片描述


    time代码性能检测

    说起来console.timeconsole.timeEnd这对兄弟也是经常会使用到的console命令

    浏览器将以毫秒为单位,输出对应计时器所经过的时间,可以测试time和timeEnd之间JavaScript代码执行的时间

    console.time(1)
    var knum = 0;
    for (var i = 0; i < 10000; i++)
    {
    	knum /= i;
    }
    console.timeEnd(1)
    

    在这里插入图片描述
    除此之外,其实还有一个console.timeLog命令

    在控制台输出计时器的值,但是此命令的发动是有条件的,该计时器必须已经通过 console.time() 启动

    console.timeLog命令的功能与timeEnd类似,但是timeEnd是结束,后面就无法再用当前的time计时器了timeLog之后还可以接着使用当前的time计时器

    例子:timeEnd结束后,timeLog失效

    console.time(1)
    var knum = 0;
    for (var i = 0; i < 10000; i++)
    {
    	knum /= i;
    }
    
    console.timeEnd(1);
    for (var i = 0; i < 100000; i++)
    {
    	knum /= i;
    }
    console.timeLog(1);
    

    在这里插入图片描述


    例子:timeLog结束后,timeEnd可以继续

    console.time(1)
    var knum = 0;
    for (var i = 0; i < 10000; i++)
    {
    	knum /= i;
    }
    console.timeLog(1);
    
    for (var i = 0; i < 100000; i++)
    {
    	knum /= i;
    }
    console.timeEnd(1);
    

    在这里插入图片描述


    clear控制台清理

    在cmd终端中,大家都经常会使用clear命令进行清理

    在浏览器控制条中也是同样存在clear命令的

    console.clear()命令可以清理控制台
    在这里插入图片描述


    group输出信息分组

    有时候如果大家不嫌麻烦,可以做到像文件夹目录一般在控制台输出信息 ~ o( ̄▽ ̄)o

    console.groupconsole.groupEnd这对兄弟相互结合

    console.group("分组1")
        console.log("第一次分组")
        console.group("分组1的安排")
            console.log("start")
            console.log("begin")
        console.groupEnd("分组1的安排")
    console.groupEnd("分组1")
    
    console.group("分组2")
        console.log("第二次分组")
        console.warn("警告")
    		console.error("报错")
    console.groupEnd("分组1")
    

    在这里插入图片描述
    不过其实group还有一位兄弟,叫做groupCollapsed,它与end的配合也可以完成和group相同的功能

    区别: groupCollapsed生成的输出信息会折叠,group生成的输出信息不会折叠

    console.groupCollapsed("分组1");
        console.log("第一次分组")
    		console.groupCollapsed("分组1的安排");
            console.log("start")
            console.log("begin")
    		console.groupEnd() 
    console.groupEnd() 
    
    console.groupCollapsed("分组2");
        console.log("第二次分组")
        console.warn("警告")
    	console.error("报错")
    console.groupEnd() 
    

    在这里插入图片描述



    table将数据以表格的形式显示

    使用console.table可以在控制台中以表格的形式显示出来

    使用的条件是需要一个必须参数 data,data 必须是一个数组或者是一个对象

    使用时可以添加可选参数 columns,此参数用来选择要显示的列的子集

    基础示例:

    console.table(["apples", "oranges", "bananas"]);
    

    在这里插入图片描述


    输出一个对象数组:

    var obj = {
      name: 'apple',
      age: 30,
      color: 'red'
    }
    var obj2 = {
      name: 'orange',
      age: 15,
      color: 'orange'
    }
    var obj3 = {
      name: 'banana',
      age: 24,
      color: 'yellow'
    }
    console.table([obj,obj2,obj3]);
    

    在这里插入图片描述


    使用可选参数 columns,只输出age

    console.table([obj,obj2,obj3], ["age"]);
    

    在这里插入图片描述



    trace输出一个堆栈跟踪

    console.trace显示当前执行的代码在堆栈中的调用路径
    使用这一句话,你调用方法的路径就会很明白了 (私家侦探的跟踪)

    function app() {
      function check(){
        console.trace()
        function set() {
          console.trace(2)
        }
        set()
      }
      check()
    }
    
    app()
    

    trace和trace2的运行到之前的方法都明明白白显示出来了
    建议:在方法出错或者未成功运行时调用

    在这里插入图片描述




    console输出一些有趣的

    使用%c,可以输出类似HTML中的内容

    文字变色例子:

    console.log("%c 看天上,%c 抱歉什么都没有", "color:red", "color:blue")
    

    在这里插入图片描述

    输出图片例子:

    background的用法与CSS编写类似,并且也可以设置margin和padding属性
    background:url存放图片地址

    注意:这里使用的是chrome浏览器

    console.log(" %c\n %c 看左边", "background:url('https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=844971292,1777969318&fm=11&gp=0.jpg') no-repeat center center;background-size:200px 300px ;font-size:300px", "color:red" );
    

    效果:
    在这里插入图片描述

    输出ascii画

    在线工具:

    例子:(老司机都发车了,还不快来上车)

    var d =`
    			 .-------------------------------------------------------------.
    			'------..-------------..----------..----------..----------..--.|
    			|       \\            ||          ||          ||          ||  ||
    			|        \\           ||          ||          ||          ||  ||
    			|    ..   ||  _    _  ||    _   _ || _    _   ||    _    _||  ||
    			|    ||   || //   //  ||   //  // ||//   //   ||   //   //|| /||
    			|_.------"''----------''----------''----------''----------''--'|
    			.______________________________________________________________|
    			 |)|      |       |       |       |    |      mga|      ||==|  |
    			 | |      |  _-_  |       |       |    |  .-.    |      ||==| C|
    			 | |  __  |.'.-.' |   _   |   _   |    |.'.-.'.  |  __  | "__=='
    			 '---------'|( )|'----------------------'|( )|'----------""
    			             '-'                          '-'
    `
    console.warn(d)
    

    效果:
    在这里插入图片描述


    学习资料

    https://developer.mozilla.org/zh-CN/docs/Web/API/Console
    https://www.calamus.xyz/
    https://www.cnblogs.com/tangwei89/p/11576936.html


    最后,如果各位觉得可以,请在下方
    在这里插入图片描述

    展开全文
  • 谷歌浏览器--控制台(console)调试--使用/教程/实例

    千次阅读 多人点赞 2021-11-07 13:47:26
    Console API提供了允许开发人员执行调试任务的功能,Console对象提供了浏览器控制台调试的接口。浏览器都实现了这个接口,比如:谷歌浏览器、火狐浏览器、360浏览器、Safari浏览器、IE浏览器等等。也就是说:所有...

    原文网址:谷歌浏览器--控制台(console)调试--使用/教程/实例_IT利刃出鞘的博客-CSDN博客

    简介

    说明

            本文用示例介绍浏览器使用控制台(console)调试前端的方法。

            Console API提供了允许开发人员执行调试任务的功能,Console对象提供了浏览器控制台调试的接口。浏览器都实现了这个接口,比如:谷歌浏览器、火狐浏览器、360浏览器、Safari浏览器、IE浏览器等等。也就是说:所有浏览器都可以用console进行调试。

    官网

    MDN:Console - Web API 接口参考 | MDN

    谷歌浏览器:https://developer.chrome.com/docs/devtools/console/api/

    查看所有功能

    法1:运行console命令

    法2:console.dir(console)

    技巧

    • 如果想要换行而不是直接执行命令,则按下:shift+enter
    • 查看某个元素的监听器:getEventListeners(document.querySelector('.someclass'));
      注意:此方法是Chrome浏览器的,在JS中无法直接使用。

    console.clear

    console.clear();  //清空控制台

    console.log家族

    用法1:基本用法

    console.log ('普通信息')
    console.info ('提示性信息')
    console.warn ('警示信息')
    console.error ('错误信息')

    结果如下

    用法2:输出对象 

    单纯对象

    var myObj = {
        name: 'haha',
        sex: 'male',
        obj: function(){
            console.log("hello");
        }
    }
    console.log(myObj);

    DOM对象

    HTML文件:

    <!doctype html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <title>this is title</title>
    </head>
    
    <body>
    
    <div>
        这是个Demo
    </div>
    
    </body>
    </html>
    

    输出结果:

    用法3:输出指定id的DOM节点

    代码

    <!doctype html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <title>this is title</title>
    </head>
    
    <body>
    
    <div id="abc">
        这是个Demo
    </div>
    
    </body>
    </html>
    

    执行结果

    注意:用$('#abc')可以达到同样效果。 

    格式化

            console对象的上面4种方法,都可以使用printf风格的占位符。不过,占位符的种类比较少,只支持下边几种。

            console.log() 接收不定参数,参数间用逗号分隔,最终会输出会将它们以空白字符连接。

    符号含义

    %d

    或%i

    数字
    %s字符串
    %f浮点数
    %ccss格式
    %o对象

    示例

    console.log("%d年%d月%d日",2011,3,26);
    console.log("%s是%f","圆周率",3.1415926);
    console.log("这个表示CSS样式%c红色","color:red", "炫酷吧")

    结果: 

    对象输出示例

    var dog = {};
    dog.name = "大毛";
    dog.color = "黄色";
    console.log("%o", dog);

    结果: 

    console.group(),console.groupEnd()

    简介

    console.group() :在控制台创建一个分组,随后创建的内容都会保存在里面;
    console.groupEnd() :表示着当前分组的结束。

            适合于在开发一个规模很大模块很多很复杂的Web APP时,将各自的log信息分组到以各自命名空间为名称的组里面。

    示例

    console.group("app.bundle");
    console.warn("来自bundle模块的警告信息1");console.warn("来自bundle模块的警告信息2");
    console.groupEnd();
    console.group("app.bundle");
    console.log("来自bundle模块的信息1");console.log("来自bundle模块的信息2");
    console.groupEnd();

    结果如下 

            这样的控制台信息看上去就一目了然了,就不用再为了找这是属于那一行代码输出的再翻一遍源码了。 

    console.dir()

    说明

            输出打印对象的详细键值对信息。

            若该对象为HTML元素,则该元素的DOM的表达式会按DOM树输出。 这个方法是我经常使用的,比for in方便了很多,可以详细查对象的方法。

    示例1:普通对象

    var myObj = {
        name: 'haha',
        sex: 'male',
        obj: function(){
            console.log("hello");
        }
    }
    console.dir(myObj);

    结果 

    示例2:DOM对象

    console.assert()

    简介

            对输入的表达式进行断言,只有表达式为false时,才输出相应的信息到控制台。

            当你想代码满足某些条件时才输出信息到控制台,那么你大可不必写if或者三元表达式来达到目的。console.assert()就是最好的选择。

    示例

    var isDebug=false;
    console.assert(isDebug,'开发中的log信息');

    结果

    console.count()

    简介

    统计代码被执行的次数。

    示例

    function fun(){
        console.count('fun被执行的次数');
    }
    fun();
    fun();
    fun();

    执行结果

    console.table()

    简介

    传入的对象在控制台上以表格的形式呈现。

    示例

    let aa = [
        {
            a: 1,
            b: 2
        }, {
            c: 3,
            d: 4
        }
    ]
    console.table(aa);

    结果: 

    console.time(),console.timeEnd()

    简介

    可以查看一段代码执行的耗时情况。

    在使用的时候这两个方法需要传递同一个参数,若不传,则为“default”

    示例

    console.time("Array耗时");
    var array= new Array(10000000);
    for (var i = array.length - 1; i >= 0; i--) {
        array[i] = new Object();
    };
    console.timeEnd("Array耗时");

    结果:

    console.profile(),console.profileEnd()

    简介

    想要查看CPU使用相关的信息时,可以使用console.profile配合 console.profileEnd来完成这个需求。

    示例

    console.profile("Array耗时");
    var array= new Array(10000000);
    for (var i = array.length - 1; i >= 0; i--) {
        array[i] = new Object();
    };
    console.profileEnd("Array耗时");

    有人说,在Profiles面板里面查看就可以看到cpu相关使用信息,但我并没有找到。他们的测试结果是:

    其他功能

    $_       // 上一个表达式的值
    $0~$4  // 最近5个最近选中的DOM元素

    $         // 对JavaScript的document.querySelector() 的封装
    $$       // 对JavaScript的 document.querySelectorAll 的封装

    dir       // 其实就是 console.dir
    keys    // 取对象的键名, 返回键名组成的数组
    values // 取对象的值, 返回值组成的数组
    monitor,unmonitor //监听函数执行
    debug,undebug  //函数若执行则进入断点

    $_

    简介

    上一个表达式的值

    示例

    $0~$4

    简介

            代表了最近5个你选择过的DOM节点。

            在页面右击选择审查元素,然后在弹出来的DOM结点树上面随便点选,这些被点过的节点会被记录下来,而$0会返回最近一次点选的DOM结点,以此类推,$1返回的是上上次点选的DOM节点,最多保存了5个,如果不够5个,则返回undefined。

    示例

    $

    简介

            Chrome 控制台中原生支持类jQuery的选择器,也就是说你可以用$加上熟悉的css选择器来选择DOM节点。

    $(selector)是原生JavaScript的document.querySelector() 的封装。

    示例

    $$

    简介

    $$(selector)是对ocument.querySelectorAll() 的封装。返回的是所有满足选择条件的元素的一个集合。

    示例

    copy

    简介

            可以将在控制台获取到的内容复制到剪贴板。

            注意:他不依附于任何全局变量比如window,所以其实在JS代码里是访问不了这个copy方法的,所以从代码层面来调用复制功能也就无从谈起。但愿有天浏览器会提供相应的JS实现吧~这样我们就可以通过js代码进行复制操作而不用再依赖Flash插件了。

    示例

    此时就可以ctrl+v粘贴了。

    keys,values

    简介

    keys:返回传入对象所有属性名组成的数组
    values:返回所有属性值组成的数组

    示例

    var myObj = {
        name: 'haha',
        sex: 'male',
        obj: function(){
            console.log("hello");
        }
    }
    keys(myObj);
    values(myObj);

    结果 

    monitor,unmonitor

    简介

            monitor(function),它接收一个函数名作为参数,比如function a,每次a被执行了,都会在控制台输出一条信息,里面包含了函数的名称a及执行时所传入的参数。

            而unmonitor(function)便是用来停止这一监听。

    示例

    function sayHello(name){
        console.log('hello,' + name);
    }
    monitor(sayHello);
    sayHello('abc');
    sayHello('def');
    unmonitor(sayHello);

    结果 

    debug,undebug

    简介

            也是接收一个函数名作为参数。当该函数执行时自动断下来以供调试,类似于在该函数的入口处打了个断点,可以通过debugger来做到,同时也可以通过在Chrome开发者工具里找到相应源码然后手动打断点。而undebug 则是解除该断点。

    示例

    其他

    Chrome控制台实用指南 - 知乎
    Chrome 控制台console的用法 - SegmentFault 思否
    Chrome控制台浏览器 console用法_pw251的博客-CSDN博客

    展开全文
  • 是时候全面了解一下window.console了!

    千次阅读 2020-06-06 19:41:50
    console.assert(value, [...message])2. console.clear()3. console.count([label])4. console.countReset([label])5. console.debug(data, [...args])6. console.dir(obj)7. console.dirxml(...data)8. console....
  • 全网最全console命令解析总结

    千次阅读 2022-01-04 14:21:14
    1、console.assert() 在浏览器中当console.assert()方法接受一个值为假断言时,会向控制台输出传入的内容,但并不会中断代码的执行 const errorMsg = 'the # is not even'; for (let number = 2; number <= 5; ...
  • console详解

    千次阅读 2020-05-30 11:46:04
    文章目录consoleconsole.log()console.dir()console.error()console.info()console.debug()console.assert()console.trace()console.time()console.group()console.table()console.warn() console console通常是...
  • linux console

    千次阅读 2017-12-03 01:17:11
    2.从内核第二阶段启动分析控制台console注册流程 路径: linux-3.10.101/init/main.c asmlinkage void __init start_kernel(void) { //...... pr_notice("Kernel command line: %s\n", boot_...
  • console.log()和console.dir()的区别

    千次阅读 2020-11-10 11:55:34
    前言:本博文主要讲解console.log()和console.dir()的区别。更多关于console的详细方法请查看: https://segmentfault.com/a/1190000004528137 文章目录一、案例二、运行效果图三、总结 一、案例 <!DOCTYPE ...
  • 浏览器 console使用方法

    千次阅读 2020-11-22 01:49:21
    console.log(), console.error(), console.warn(), console.info() 1、console.log() 用于输出普通信息 2、console.info() 用于输出提示性信息 3、console.error() 用于输出错误信息 4、console.warn() 用于输出警示...
  • MinIO: Console endpoint is listening on a dynamic port , please use --console-address
  • 修改Console口登录密码

    千次阅读 多人点赞 2022-01-24 09:47:33
    [HUAWEI] user-interface console 0 [HUAWEI-ui-console0] authentication-mode password [HUAWEI-ui-console0] set authentication password cipher Huawei@123 [HUAWEI-ui-console0] return <HUAWE
  • Console.WriteLine()方法

    千次阅读 2020-04-23 13:12:47
    namespace ConsoleApp1//声明命名空间 { class Program { static void Main(string[] args) { Console.WriteLine("{0},{1},{2},{1}", "a", "b", "c"); Console.ReadLine(); } } } 输出: a,b,c,d; 其中 Console....
  • JavaScript console.log()函数示例教程

    千次阅读 2020-10-04 21:40:25
    HTML DOM provides the console object in order to use some auxiliary functions related to the ... console.log() is one of the useful functions where it will simply print given data, integer, vari...
  • console用于在控制台输出内容,他的出现可以让我们在开发过程中调试代码变得方便,而且console也为我们提供了很多的方法,有些再调试过程中非常实用,可以节省很多时间。 console使用 我们在开发过程中经常会用到...
  • 自定义Console打印结果样式

    千次阅读 2022-02-04 16:21:21
    console.log("%c你挚爱的强哥友情提示您:","background:green;color:white;font-family:'微软雅黑';font-size:60px;font-weight:bold");
  • console.log 可以输出DOM节点,如果想要看DOM节点下的属性,可以使用 console.dir,console.dir能递归打印对象的所有属性,如下如打印一个DOM节点 console.dir(window.document) 3.console.log() 语法: console.log...
  • Javascript的console.log()用法

    千次阅读 2021-06-16 09:40:10
    把下面代码保存为html文件,然后IE8---F12---脚本---...javascript的console.log()用法/*console.log 原先是 Firefox 的“专利”,严格说是安装了 Firebugs 之后的 Firefox 所独有的调试“绝招”。这一招,IE8 学...
  • python console

    千次阅读 2021-02-07 21:01:35
    python console关于Pycharm里面的python console选中这个run with Python Console,会在运行结果会在python console里面,而且每次ctrl+shift+F10都会产生新的python console,建议取消勾选。![]...
  • 自制Console

    千次阅读 2019-09-13 15:11:11
    Console线扩展: 网络设备Console口一般为RJ-45接口 通过一端为RJ-45一端为DB-9的母头形成的Console连接到主机 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~...
  • 忘记交换机Console口密码怎么办

    千次阅读 2021-08-01 21:07:31
    针对新版本的交换机而言,进入BOOTROM后会有一个“Clear password for console user”选项,选在该选项后就可以清除Console口的密码,但是对于一个老式的交换机而言,如果没有上述选项,又该如何清除设备密码呢?...
  • 当忘记Console密码时候,想要不丢配置可以将设备重启,进行以下操作更改密码。 1、设备重启之后,看到...Skip Authentication for Console Login 2、 下面就是BootROM的菜单项,选择8,回车 注:6和8都可以跳过C...
  • 平时打一个console.log()需要半天,如果console打错了又是需要半天找错,webpack构建的小项目还好,万一是大项目或者gulp,又是半天的漫长等待,简直是浪费生命。 { "redConsole": { "prefix": "lr", "body":...
  • 目录 目录 console 对象与控制台 ...console.warn(),console.error() console.table() console.count() console.dir(),console.dirxml() console.assert() console.time(),console.timeEnd() ...
  • 7 个让你的 console.log() 输出脱颖而出的提示和技巧

    万次阅读 多人点赞 2021-10-24 09:25:20
    1. 设计你的 console.log 虽然这并不是必要的,但你想如果你在你的个人网站的控制台上留下一条彩蛋信息,会不会让访客眼前一亮?你永远不知道谁会在看,大家可以在haiyong.site上查看我的 想要完成上面的效果,你只...
  • 浏览器console命令

    万次阅读 2019-05-18 13:54:34
    作为一名前端开发人员,在调试中使用最多的就是console命令,通过console命令可以在控制台打印一些信息,这些信息便于我们进行开发调试。工欲善其事必先利其器,这篇文章主要来讲一讲console的神奇功能。 二、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,652,317
精华内容 1,060,926
关键字:

console