精华内容
下载资源
问答
  • console驱动,win10

    2018-11-29 10:42:08
    console驱动,win10
  • VMware Remote Console 10.0.4 for Windows官网软件最新版
  • console 驱动大全

    2016-08-09 16:09:33
    支持 win linux 64位 32位 等系统,支各个厂家的USB转串口驱动!
  • usb转console全系列驱动,支持Linux、MAC、windows等各种操作系统。
  • 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调试用驱动,测试没问题
  • Linux 内核console设备实现详解

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

    本文基于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

    展开全文
  • rocketmq web-console 管理界面war包

    热门讨论 2016-04-07 15:00:37
    rocketmq管理界面,下载发布到tomcat下,修改config.properties中的rocketmq.namesrv.addr参数即可。该参数为nameserver的地址
  • Android studio 3.5 运行...10:12 Emulator: ERROR: Unable to access 'C:\Users\璋捣灞盶.emulator_console_auth_token': emulator console will not work 10:12 Gradle build finished in 10 s 159 ms 10:12 ...

    Android studio 3.5 运行AVD出现

    10:12   Emulator: ERROR: Unable to access 'C:\Users\璋捣灞盶.emulator_console_auth_token': emulator console will not work
    
    10:12   Gradle build finished in 10 s 159 ms
    
    10:12   Emulator: emulator: WARNING: EmulatorService.cpp:448: Cannot find certfile: D:\Android\sdk\emulator-grpc.cer security will be disabled.
    
    10:12   Emulator: Started GRPC server at 127.0.0.1:8554
    

    一开始出现这个问题时是因为发现运行avd后不自动运行app程序,上网查了一下,有的说删除
    emulator_console_auth_token文件,有的说修改C盘下的用户名为英文。

    大概意思是由中文路径引起的问题。不过修改C盘下的用户名十分麻烦,一定要修改的话,还不如直接建一个新用户。

    如何解决

    谷歌已经修复了这个问题

    如果你用的是3.0以上版本的AS,直接设置管理员运行即可解决。

    如果你用的是3.0以下版本的AS解决办法是卸载干净Android studio和sdk,重装之后设置为管理员方式运行即可解决。

    我朋友单单设置了管理员方式运行就好了,主要是不报第一行错误即可。

    展开全文
  • 是时候全面了解一下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....


    毫不夸张地说,window.console算是前端最重要的调试工具之一。

    一般来说,一段程序只需要输出几个重要变量,整个的执行过程就可以一目了然。浏览器为我们提供了类似下面的界面来输出这些内容:
    在这里插入图片描述
    window.console提供了很多的方法对输出结果进行格式化,不过最常用的大概就是console.log(没办法,它太过强大)了。不过console的秘密可远不止这些:

    一、常用函数

    1. console.assert(value, […message])

    断言函数。

    assert是很多测试框架最常用的断言函数,目的是验证第一个参数value是否为真。如果是,则不输出任何内容,否则就抛出一个Assertion failed异常,表示断言失败,并输出后续参数。

    value除了可以是一个变量,更常见的是一个表达式,或一个真值函数的返回值。如:

    console.assert(true, '断言失败');  // 第一个参数值为true,没有输出
    console.assert({}, '断言失败'); // {}转化为布尔值也是true,断言成功,没有输出
    
    console.assert(1 === '1', '数值1和字符串1不等');
    > Assertion failed: 数值1和字符串1不等
    
    console.assert(equal(a, b), 'a和b不相等');
    > 如果函数返回true,则不输出内容,否则将抛出异常
    
    console.assert([] == [], '断言失败', '[]和[]不相等')
    > Assertion failed: 断言失败 [][]不相等
    

    2. console.clear()

    清空控制台,并显示Console was cleared

    3. console.count([label])

    用于在控制台维护一个计数器。

    count可以接受一个参数作为计数器的标签,如果不传,则默认是default。每次调用console.count,标签对应的计数器就会加1:

    > console.count()
    default: 1
    
    > console.count('default')
    default: 2
    
    > console.count('abc')
    abc: 1
    
    > console.count('xyz')
    xyz: 1
    
    > console.count('abc')
    abc: 2
    
    > console.count()
    default: 3
    

    4. console.countReset([label])

    重置计数器。

    调用该方法可以使计数器的值失效,并在下次调用count时重新从1开始计数:

    > console.count('abc');
    abc: 1
    
    > console.countReset('abc');
    
    > console.count('abc');
    abc: 1
    

    countReset函数本身并没有输出。

    5. console.debug(data, […args])

    据MDN文档介绍,该方法应该与console.log类似,但是在Chrome控制台调用时发现该函数总是返回undefined,因此建议不要使用该方法。

    6. console.dir(obj)

    以一种可折叠的方式显示一个对象:
    在这里插入图片描述
    在这里插入图片描述
    不过其实使用console.log输出对象时的格式也大同小异:
    在这里插入图片描述
    两者的差异主要在于console.dir可以显示数据类型,而console.log不显示。

    Node环境下,该方法与浏览器控制台存在很大差异。此时它还可以传入一个options对象,它包含三个值,分别是

    1. showHidden,是否显示不可枚举属性和符号属性,node控制台默认不显示此类属性。
    2. depth,格式化对象时的递归次数,也就是对象展开深度。在Node控制台中,无法显示折叠按钮和手动展开,只能一次输出,所以需要规定对象的展开次数,默认2次。下图中,深度为3的属性没有接着展开,而是显示为{ name: [Object] }。
      在这里插入图片描述
    3. colors,是否对输出结果着色,默认不着色。着色规则可定制,默认效果大致如下:
      在这里插入图片描述
      注意,options在浏览器控制台下是无效的。

    7. console.dirxml(…data)

    如果传入的是一个xml/html对象,会以对应的格式打印它,否则将按照普通javascript对象的格式打印到控制台。

    8. console.error(data, […args])

    输出一条错误提示。

    它的第一个参数是要输出的提示信息,后续的参数可以作为它的格式化数据使用,如:
    在这里插入图片描述
    %s是一个字符串占位符,它会被替换为后续对应的参数inputValue,这种输出方式类似于c语言中常用的printf函数。

    9. console.group([…label])

    定义一个输出组,输出组内的输出都会默认进行缩进,如:
    在这里插入图片描述
    该函数非常适用于输出一组相关数据。

    console.groupEnd()用于结束一个输出组,处在group函数和groupEnd函数之间的,都是该输出组的内容。console.group可以接受一个字符串作为标签,从截图中可以看到,默认的组名是console.group。另外,输出组可以嵌套,内部的输出组将会进一步缩进:
    在这里插入图片描述

    10. console.groupCollapsed([label])

    功能与group类似,不过它定义的输出组默认是收起的,如:
    在这里插入图片描述

    11. console.groupEnd()

    结束一个输出组,用法见上述截图。

    12. console.info(data, […args])

    现在console.info是console.log的别名,两者的输出没有差别。

    13. console.log(data, […args])

    向控制台输出若干个参数。允许使用格式化语法:

    console.log("参数值:%s", 'carter');
    > 参数值:carter
    

    14. console.table(tabularData[, properties])

    用table的方式输出一个数组或对象。比如我们现在有下面这样一个数组:

    let user = [{name: "张三", age: 21},{name: "李四", age: 22},{name: "王二", age: 21},{name: "张三丰", age: 212}]
    

    如果直接用console.log输出,未免看起来不太直观,我们就可以用console.table以表格的形式输出:

    console.table(user);
    

    结果如下:
    在这里插入图片描述
    控制台里绘制表格,就是这么容易!

    函数的第二个参数用来规定表格中应该呈现哪些列,比如我们现在只需要显示name,不显示age,可以这样写:console.table(user, ['name']);
    在这里插入图片描述

    15. console.time([label])

    启动一个控制台计时器。

    我们之前可能一般这样来测算时间:

    let startTime = (new Date()).getTime()
    ...
    let endTime = (new Date()).getTime()
    console.log(endTime - startTime);
    

    但其实可以通过这样的代码实现:

    console.time();
    ...
    console.timeEnd();
    

    对于精确计时,第二种方法的优势是巨大的,因为在以毫秒为单位的情况下,第一种只能精确到整数位,第二种则可以精确到小数点后十位:
    在这里插入图片描述
    如果你想比较1000次空循环和10000次空循环的性能差异,第一种方法会告诉你两者都是0毫秒(因为它只能精确到毫秒,而10000次空循环的耗时远不到1毫秒),而第二种方法会输出一个精度相当高的值。

    console.time还可以接收一个字符串作为计时器的标签,用于区分不同的计时器。需要结束计时只需要给console.timeEnd()传入这个label即可。控制台最多可接受10000个计时器同时计时。

    16. console.timeEnd([label])

    结束计时,用法如上。

    17. console.timeLog(label)

    打印特定计时器的当前计时时间。

    有时我们可能不一定只在计时结束时才需要知道总的计时,而是在计时的某些时间节点连续输出多组值,比如:

    console.time('process');
    for(var i = 0; i < 100; i++) {
      ...
      console.timeLog('process');
    }
    console.timeEnd('process');
    

    这样,每次循环完毕都会输出一次计时结果。

    18. console.trace([message],[…args])

    打印信息及堆栈信息。
    在这里插入图片描述
    可以看到,控制台会像console.error一样输出完整的调用栈,这非常有利于定位。

    19. console.warn(data, […args])

    输出警告信息,如:
    在这里插入图片描述
    值得一提的是,如图,warn也会输出堆栈信息。

    二、用法说明

    当向函数传入多个值时,一般来说控制台会直接将它们以字符串的方式拼接并输出:

    var car = "Dodge Charger";
    var someObject = { str: "Some text", id: 5 }; 
    console.log("My first car was a", car, ". The object is:", someObject);
    
     > My first car was a Dodge Charger . The object is: ({str:"Some text", id:5})
    

    但是当参数中含有格式化字符串时,它后面的参数将依次替换到对应的占位符中:
    在这里插入图片描述
    控制台支持以下4种格式化数据:

    占位符含义
    %o 或 %O对象类型。两者的差别为,%O会附带输出对象类型(类似console.dir),%o则不会
    %d 或 %i数值类型。可以使用类似%.2d进行精确格式化,但Chrome不支持精确格式化
    %s字符串
    %f浮点类型。同样的,在非Chrome浏览器中可以进行精确格式化

    另外,控制台还允许对输出定义样式,该功能使用%c作为占位符,如:
    在这里插入图片描述
    可以看到,%c后续的所有字符串都会被应用后续定义的样式。如果你只希望对字符串中间的一部分子串应用样式可能会稍显复杂,你需要在子串结尾处再插入一个%c,然后手动将后续样式重置为默认样式:
    在这里插入图片描述

    总结

    浏览器的控制台使用起来并不难,不过还是有很多小技巧相信大多数同学都没使用过,希望读完本文后,可以尝试着用起来,对提高开发效率会有很大帮助。

    展开全文
  • Console.readkey():监听键盘事件,可以理解为按任意键执行。  Console.read():读取键盘输入的第一个字符,返回ASCII值。回车退出  Console.readline():读取所有字符,返回字符串。回车退出  Console.Write...
    Console.readkey():监听键盘事件,可以理解为按任意键执行。 
    
    Console.read():读取键盘输入的第一个字符,返回ASCII值。回车退出 
    Console.readline():读取所有字符,返回字符串。回车退出 
    Console.Write():控制台输出,不换行。 

    Console.Writeline():控制台输出,换行。


    ReadKey读取键盘输入,无需缓冲
    Read读取输入缓冲区中的下个字符
    也就是用ReadKey,你按下某个键的同时就被它读到了
    而用Read,你输入一个字符,还需要按enter才能结束操作

    Console.ReadLine(); 会等待直到用户按下回车,一次读入一行
    Console.ReadKey(); 则是等待用户按下任意键,一次读入一个字符。


    展开全文
  • 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详解

    千次阅读 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通常是...
  • MinIO: Console endpoint is listening on a dynamic port , please use --console-address
  • console用于在控制台输出内容,他的出现可以让我们在开发过程中调试代码变得方便,而且console也为我们提供了很多的方法,有些再调试过程中非常实用,可以节省很多时间。 console使用 我们在开发过程中经常会用到...
  • 自制Console

    千次阅读 2019-09-13 15:11:11
    Console线扩展: 网络设备Console口一般为RJ-45接口 通过一端为RJ-45一端为DB-9的母头形成的Console连接到主机 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~...
  • Console调试常用用法

    千次阅读 2018-12-25 15:15:14
    前端程序员在快速调试的时候console.log()是最常用的命令,而除了log还有更多强大而且使用的命令 一、显示信息的命令 console.log("normal"); // 用于输出普通信息 console.info("information"...
  • 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-05-18 13:54:34
    作为一名前端开发人员,在调试中使用最多的就是console命令,通过console命令可以在控制台打印一些信息,这些信息便于我们进行开发调试。工欲善其事必先利其器,这篇文章主要来讲一讲console的神奇功能。 二、...
  • 目录 目录 console 对象与控制台 ...console.warn(),console.error() console.table() console.count() console.dir(),console.dirxml() console.assert() console.time(),console.timeEnd() ...
  • 使用RocketMQ Console源码搭建RocketMQ Console与基本使用
  • Intel(R) Matrix Storage Console(中文版)

    热门讨论 2012-05-16 08:47:33
    您可以从以下两种模式检视 Intel(R) Matrix Storage Console:「基本模式」和「进阶模式」。「基本模式」是一种简单的模式,以状态讯息和图示的形式显示装置资讯。在异常的情况下,例如硬碟遗失或硬碟发生故障时,「...
  • console的用法

    千次阅读 2018-08-11 10:16:24
    Javascript调试命令——你只会Console.log() ? Console 对象提供对浏览器控制台的接入(如:Firefox 的 Web Console)。不同浏览器上它的工作方式是不一样的,但这里会介绍一些大都会提供的接口特性。 Console对象...
  • 平时打一个console.log()需要半天,如果console打错了又是需要半天找错,webpack构建的小项目还好,万一是大项目或者gulp,又是半天的漫长等待,简直是浪费生命。 { "redConsole": { "prefix": "lr", "body":...
  • 关于webpack的loader小教程:如何删除代码中的console

    千次阅读 多人点赞 2020-02-20 11:57:48
    关于webpack的loader小教程:如何删除代码中的console 在开发环境中,我们经常会加入很多console.log来做代码的调试,但是我们并不希望当项目上线后,还会有打印的值,因此我们需要讲这些console在上线前全部删掉。虽然...
  • 一,Android studio运行模拟器出现如下错误:Emulator: ERROR: Unable to access ‘C:\Users\鏉庨摥.emulator_console_auth_token’: emulator console will not work,在各种论坛找了大半天,终于找到了解决方法。...
  • Write()和WriteLine()都是System.Console提供的方法,两者主要用来将输出流由指定的输出装置(默认为屏幕)显示出来.两着间的差异在Console.WriteLine()方法是将要输出的字符串与换行控制字符一起输出,当次语句执行完毕...
  • console.log 的内容,怎么在开发者工具的“console”没显示出来呢。本人新手,求大佬指教 ``` chrome.browserAction.onClicked.addListener(function (tab) { console.log('Turning ' + tab.url + ' red!');...
  • JavaScript的Console扩展和输出级别控制

    千次阅读 2017-03-09 19:49:51
    扩展Console的原由Console作为日志输出调试的功能还是很强大的。可以打印正常的日志信息,错误信息(log,info,warn,error)等等,还可以详细详细显示函数调用栈,信息的输出函数名以及代码位置,功能可谓非常强大。 ...
  • console.log 用法

    千次阅读 2018-11-29 21:42:49
    【转】console.log 用法 标签: 转自http://www.cnblogs.com/ctriphire/p/4116207.html 大家都有用过各种类型的浏览器,每种浏览器都有自己的特色,本人拙见,在我用过的浏览器当中,我是最喜欢Chrome的,因为它...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,291,378
精华内容 916,551
关键字:

consloe