免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: linuxer_lhw
打印 上一主题 下一主题

如何在伪终端(通过ssh远程登录)显示内核打印信息 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2010-07-13 20:29 |只看该作者
回复 9# Godbach


    没死机可以,但调试时出oops一般就死机了就没法看了,重启后就没了。死机前oops倾泄出来的信息会打印到控制台上,但我每次都得跑到服务器那边看,很麻烦,所以我想能不能将prink信息直接打印到本地机器的终端上,我本地机器是windows,通过SecureCRT远程登录

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
12 [报告]
发表于 2010-07-13 20:37 |只看该作者
那就用netconsole传递到另外一台Linux上好了。
BTW,你的系统重启之后就没有以前的日志信息了吗,用的是硬盘吗?

论坛徽章:
0
13 [报告]
发表于 2010-07-13 22:07 |只看该作者
解决办法1:dmesg


解决方法2:
void print_string(char *str)
{
    struct tty_struct *my_tty;

    my_tty = current->tty;

    if (my_tty != NULL) {

                                       (*(my_tty->driver).write)( my_tty, 0, str,strlen(str));
                                       (*(my_tty->driver).write)( my_tty, 0, "" "", 2);
    }
}

论坛徽章:
0
14 [报告]
发表于 2010-07-13 22:08 |只看该作者
你也可以再封一层,用va_start封成printf的形式,就更完美了

论坛徽章:
0
15 [报告]
发表于 2010-07-14 14:58 |只看该作者
本帖最后由 lmarsin 于 2010-07-14 15:26 编辑

回复 10# linuxer_lhw


    花了半天的时间,对昨天的想法做了验证,基本实现了,并贴上代码。以下代码只是验证我的思路而已,请大牛们拍砖。

我们知道,当通过ssh连接主机时,linux会在/dev/pts/下创建对应的终端设备文件,通过写此文件即可向对应的终端发送信息,以下图示例:

首先通过SecureCRT登录到linux主机,可以看到/dev/pts下有设备文件0。
然后,在虚拟机的命令行上输入echo "123456789" > /dev/pts/0 回车后,便在ssh的虚拟终端上输出123456789。

我们知道printk最终是输出到console,只要我们创建一个自己的console并注册到系统中,这样当调用printk时,我们可以很容易的得到printk输出的信息,此时再将此信息输向到/dev/pts/xxx即可。

代码 ptyconsole.rar (1.98 KB, 下载次数: 155)

在虚拟机的窗口操作效果如下:通过printk打印的内容同时输出到了终端上。

评分

参与人数 1可用积分 +30 收起 理由
Godbach + 30 原创

查看全部评分

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
16 [报告]
发表于 2010-07-14 15:25 |只看该作者
多谢lmarsin兄的分享。刚刚测试了一下,是可以打印远程登录的终端上。
不过我本地出现了一下错误,应该是oops信息:
ptyfile:/dev/pts/1
                                                  np.pty_file:cd068900
                                                                      open file: 0
                                                                                  BUG: sleeping function called from invalid context at include/asm/uaccess_32.h:512
                       in_atomic():0, irqs_disabled():1
                                                       Pid: 5112, comm: insmod Not tainted 2.6.24.4 #2
                                                                                                       [<c01259f8>] __might_sleep+0xa4/0xa9
                                                                                                                                            [<c01ec615>] copy_from_user+0x2d/0x60
                                     [<c02284a7>] tty_write+0x132/0x1c7
                                                                        [<c022c585>] write_chan+0x0/0x1b3
                                                                                                          [<c017389a>] vfs_write+0xac/0x12c
                                                                                                                                            [<e0a0a04b>] write_msg+0x4b/0x73 [ptyconsole]
                                             [<e0a0a000>] write_msg+0x0/0x73 [ptyconsole]
                                                                                          [<c01289ba>] __call_console_drivers+0x51/0x5b
                                                                                                                                        [<c0128ad7>] call_console_drivers+0xb2/0xd4
                                       [<c01290f4>] release_console_sem+0x70/0xb0
                                                                                  [<e0a0a12a>] init_ptyconsole+0x40/0x54 [ptyconsole]
                                                                                                                                      [<c01461df>] sys_init_module+0x91/0x11b
                                 [<c0104dc6>] sysenter_past_esp+0x5f/0x85
                                                                          =======================
                                                                                                 ptyconsole: network logging started

论坛徽章:
0
17 [报告]
发表于 2010-07-14 15:31 |只看该作者
本帖最后由 lmarsin 于 2010-07-14 15:38 编辑

回复 16# Godbach

你的系统打开了CONFIG_DEBUG_SPINLOCK_SLEEP功能,应该是在中断或软中断上下文的输出过程中睡眠了,printk在中断或软中断以及进程上下文中都可以被调用。
代码只是验证了我的思路,没有进行中断调用的测试。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
18 [报告]
发表于 2010-07-14 15:37 |只看该作者
另外,lmarsin兄测试发生oops的情况了吗。如果oops发生了,可能一些write操作都不能保证了,还有可能输出到终端吗

论坛徽章:
0
19 [报告]
发表于 2010-07-14 15:39 |只看该作者
本帖最后由 lmarsin 于 2010-07-14 15:43 编辑

回复 18# Godbach
这种情况没有测试。

对于你上面发生的问题,可以在write_msg函数中,注释掉
local_irq_save(flags);
local_irq_restore(flags);
之后测试下看看

static void write_msg(struct console *con, const char *msg, unsigned int len)
{
#if USE_SYS_CALL
        unsigned long flags;
        mm_segment_t old_fs;
               
        old_fs = get_fs();
        set_fs(KERNEL_DS);
        sys_write(np.pty_fd, msg, len);
        set_fs(old_fs);
#else
        unsigned long flags;
        ssize_t ret = -EBADF;
        mm_segment_t old_fs;
               
        if (np.pty_file) {       
                old_fs = get_fs();
                set_fs(KERNEL_DS);
                       
                loff_t pos = np.pty_file->f_pos;
                ret = vfs_write(np.pty_file, msg, len, &pos);
                np.pty_file->f_pos = pos;
               
                set_fs(old_fs);
        }
#endif
}

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
20 [报告]
发表于 2010-07-14 15:44 |只看该作者
你的代码中定义USE_SYS_CALL为0.也就是不走这个分支吧。
注释掉了local_irq_save(flags);
对应的local_irq_restore(flags);也需要注释掉啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP