Linux oops信息的分析 -----------_67c950bda58c74ad2131d49b486f35b5==>477sdt82-程序员宅基地

技术标签: linux调试总结  



Andrew Huang <[email protected]> 转载请注明作者及网址

oops是英语口语"糟糕"的意思,当LINUX 内核发生严重错误时,比如内存段错误时,将会提示一大段信息。就提示 Oops,因此得名,
Oops提示信息相当多,包括出问题时的,各个常用寄存器的值,调用的堆栈,以及出错的可能原因


1.oops 的格式

内核的文档里的详细的Oops的说明,的名字是
Documentation/oops-tracing.txt
http://www.mjmwired.net/kernel/Documentation/oops-tracing.txt

oops第一段出错是内存page地址,
例如提示
Unable to handle kernel NULL pointer dereference at virtual address 00000000
pgd = c7510000
往往表示碰到空指针了。

第二段出错时是寄存器的快照,不同CPU显示不同情况。
其中基本上所有CPU都会有的PC寄存器(Program counter register),它保存最后出问题的地址。
LR保存着函数返回地址。这里就比较容易看出是谁出问题
<8>PC is at memcpy+0x48/0x330
< 8>LR is at s3c_fimc_v4l2_enum_fmt_vid_cap+0x44/0x4c

这里可以看出,最后出问题代码在 memcpy里,而它是被s3c_fimc_v4l2_enum_fmt_vid_cap调用。结合前面的原因,可以知道应该是在memcpy里碰到空指针。
函数名后面的两个数字,第一个是调用偏移量,第二个是函数总尺寸。

比如上例,在s3c_fimc_v4l2_enum_fmt_vid_cap的函数机器代码总尺寸是0x4c,在偏移量 0x44处调用了memcpy,而memcpy本身的总尺寸是0x330,而在偏移量0x48处,导致出现Oops信息


最重要是第三段,即可出错的调用堆栈(Call Trace).从这里即可推算出错的所在函数,参考下例.
这里被调用函数上,调用函数在下。


  1. <8>Backtrace:
  2. <8>[<c02000f4>] (s3c_fimc_v4l2_enum_fmt_vid_cap+0x0/0x4c) from [<c01caee8>] (__video_do_ioctl+0x600/0x3238)
  3. <8>[<c01ca8e8>] (__video_do_ioctl+0x0/0x3238) from [<c01d04b4>] (v4l1_compat_get_capabilities+0x1c0/0x25c)
  4. <8>[<c01d02f4>] (v4l1_compat_get_capabilities+0x0/0x25c) from [<c01d14b0>] (v4l_compat_translate_ioctl+0x150/0x238)
  5. <8>[<c01d1360>] (v4l_compat_translate_ioctl+0x0/0x238) from [<c01caa00>] (__video_do_ioctl+0x118/0x3238)
  6. <8>[<c01ca8e8>] (__video_do_ioctl+0x0/0x3238) from [<c01cdcb8>] (__video_ioctl2+0x198/0x2a0)
  7. <8>[<c01cdb20>] (__video_ioctl2+0x0/0x2a0) from [<c01cdddc>] (video_ioctl2+0x1c/0x20)
  8. <8>[<c01cddc0>] (video_ioctl2+0x0/0x20) from [<c009e108>] (vfs_ioctl+0x64/0x74)
  9. <8>[<c009e0a4>] (vfs_ioctl+0x0/0x74) from [<c009e57c>] (do_vfs_ioctl+0x438/0x488)
上述最后几个调用就是
v4l1_compat_get_capabilities--> __video_do_ioctl --> s3c_fimc_v4l2_enum_fmt_vid_cap

函数名前的地址表示调用地址,函数名后面两个数字,也是表示调用入口偏移量(总是0x0)和函数机器代码总尺寸
而from后面的地址是调用该函数的地址。以及对应的函数名和其偏移量/总尺寸
如下例:
[<c02000f4>] (s3c_fimc_v4l2_enum_fmt_vid_cap+0x0/0x4c) from [<c01caee8>] (__video_do_ioctl+0x600/0x3238)
[<c01ca8e8>] (__video_do_ioctl+0x0/0x3238) from [<c01d04b4>]


__video_do_ioctl在 该函数总尺寸是0x3238,调用子函数的偏移量为0x0,这个偏移量的绝对地址是0xc01ca8e8处,这里调用函数s3c_fimc_v4l2_enum_fmt_vid_cap.
s3c_fimc_v4l2_enum_fmt_vid_cap这个函数总尺寸是0x4c,而它的from后的地址,正好就是上一个调用函数的地址。并且在括号内部注明是__video_do_ioctl的偏移量0x600处.


2.一个oops实例
我自己写了一个v4l2的测试程序,在s3c6410(linux 2.6.28)对cmos的的摄像头的驱动执行了ioctl的VIDIOC_ENUM_FMT操作来查询它支持的视频格式,结果就出了oops信息了。

  1. ###Unable to handle kernel NULL pointer dereference at virtual address 00000000
  2. pgd = c7510000
  3. [00000000] *pgd=574f6031, *pte=00000000, *ppte=00000000
  4. <8>Internal error: Oops: 17 [#1]
  5. <8>Modules linked in:
  6. <8>CPU: 0 Not tainted (2.6.28.6-FriendlyARM #70)
  7. <8>PC is at memcpy+0x48/0x330
  8. <8>LR is at s3c_fimc_v4l2_enum_fmt_vid_cap+0x44/0x4c
  9. <8>pc : [<c0170c08>] lr : [<c0200138>] psr: 80000013
  10. <8>sp : c74fba84 ip : 00000000 fp : c74fbabc
  11. <8>r10: c04dc710 r9 : 00000001 r8 : c0405602
  12. <8>r7 : c74766e0 r6 : c04dc710 r5 : 00000000 r4 : c74fbc80
  13. <8>r3 : 00000000 r2 : ffffffc0 r1 : 00000000 r0 : c74fbc80
  14. <8>Flags: Nzcv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user
  15. <8>Control: 00c5387d Table: 57510008 DAC: 00000015
  16. <8>Process test_v4l (pid: 642, stack limit = 0xc74fa260)
  17. <8>Stack: (0xc74fba84 to 0xc74fc000)
  18. <8>ba80: 00000000 c04dc710 c74766e0 c0405602 c74fbc80 c74fbc80 c0200138
  19. <8>baa0: c02000f4 c74fbc80 c0495488 c037313c c74fbbac c74fbac0 c01caee8 c0200100
  20. <8>bac0: c032ddf4 c73049c0 c005be40 c74fbacc c74fbacc c008ec04 c74fbb04 c74fbae8
  21. <8>bae0: c74fbb18 c007107c c04e7c18 00000000 00000000 c0397cc8 ffffffea c74fbb08
  22. <8>bb00: c031995c c0319820 00000000 c74aabe0 00000000 c74fbba0 c74fbb3c c74fbb28
  23. <8>bb20: c0319a14 00000064 c68cd200 00000000 00000000 c74fbb9c c03141e4 c0319978
  24. <8>bb40: c032bd1c 00000000 c74d5e00 c74fbba0 c0397cc8 00000000 bf000000 00000000
  25. <8>bb60: c747c804 c74cb00c c74fbb8c c74fbb78 c73049f0 75e3b180 00000000 00000000
  26. <8>bb80: c74fbbb4 c74fbe38 c7501100 c74766e0 c01ca8e8 00000000 c74fbc80 00000001
  27. <8>bba0: c74fbd2c c74fbbb0 c01d04b4 c01ca8f4 c74fbc1c 00000000 00000000 00000000
  28. <8>bbc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  29. <8>bbe0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  30. <8>bc00: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  31. <8>bc20: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  32. <8>bc40: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  33. <8>bc60: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  34. <8>bc80: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  35. <8>bca0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  36. <8>bcc0: 00000000 00000000 00000000 00000000 c0040a90 00000004 00000000 00000000
  37. <8>bce0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  38. <8>bd00: c00417f8 c74fbe38 c0495488 c037313c c74766e0 803c7601 00000000 c04dc710
  39. <8>bd20: c74fbd3c c74fbd30 c01d14b0 c01d0300 c74fbe2c c74fbd40 c01caa00 c01d136c
  40. <8>bd40: c74fbd5c c74fbd50 c01a96a4 c01941f4 c74fbd74 c74fbd60 c004c4c4 c01a9698
  41. <8>bd60: c04cd140 c74fa000 c74fbda4 c74fbd78 c004ca24 c004c8c0 c006c830 c032de08
  42. <8>bd80: 00000000 00000045 0000001a c72ff425 00000000 c0483b18 c74fbdb4 c74fbda8
  43. <8>bda0: c004ca90 c004c95c c74fbdcc c74fbdb8 c74fbdd4 c74fbdc0 c006bfd4 c003783c
  44. <8>bdc0: c0471c88 c0476e4c c74fbdf4 c74fbdd8 c006bf20 c006bfac 00020000 c0476e4c
  45. <8>bde0: c04768f4 c680c7b8 c74fbe14 c74fbdf8 c006eb64 c01749b4 00000000 c748b7e8
  46. <8>be00: c680c7b4 00000000 c74766e0 c74fbe38 00000000 00000000 00000000 803c7601
  47. <8>be20: c74fbee4 c74fbe30 c01cdcb8 c01ca8f4 00000002 bec77c88 2d633373 636d6966
  48. <8>be40: 00000030 00000000 00000000 00000000 00000000 00000000 00000029 00000002
  49. <8>be60: 00000000 00000000 00000000 00000000 00000000 c748b7e8 c74fbedc c74fbe88
  50. <8>be80: c007ca1c c006ee54 c00417f8 0000007d c75249f4 00000000 c74b2870 4007d000
  51. <8>bea0: 00000000 00000042 4007d000 c0565960 c74fbed4 00000000 c748b7e8 c74766e0
  52. <8>bec0: 803c7601 00000000 00000003 c002df08 c74fa000 00000000 c74fbef4 c74fbee8
  53. <8>bee0: c01cdddc c01cdb2c c74fbf14 c74fbef8 c009e108 c01cddcc c68aa1b8 bec77c88
  54. <8>bf00: c74766e0 803c7601 c74fbf7c c74fbf18 c009e57c c009e0b0 c74fbfb0 c748b7e8
  55. <8>bf20: c74fbf3c c74fbf30 c005f5f8 c0176364 c74fbf7c c74fbf40 c0034394 c005f5f4
  56. <8>bf40: c00927d0 c00bab14 00000000 00000200 c70b0dc0 ffffffff c74766e0 bec77c88
  57. <8>bf60: 803c7601 00000003 c002df08 c74fa000 c74fbfa4 c74fbf80 c009e60c c009e150
  58. <8>bf80: 60000010 00000000 00009154 00000140 00000000 00000036 00000000 c74fbfa8
  59. <8>bfa0: c002dd60 c009e5d8 00009154 00000140 00000003 803c7601 bec77c88 bec77c88
  60. <8>bfc0: 00009154 00000140 00000000 00000036 00000000 00000000 40180b60 bec77cd4
  61. <8>bfe0: 00000000 bec77c80 0000884c 4010ac3c 60000010 00000003 00000000 00000000
  62. <8>Backtrace:
  63. <8>[<c02000f4>] (s3c_fimc_v4l2_enum_fmt_vid_cap+0x0/0x4c) from [<c01caee8>] (__video_do_ioctl+0x600/0x3238)
  64. <8> r6:c037313c r5:c0495488 r4:c74fbc80 r3:c02000f4
  65. <8>[<c01ca8e8>] (__video_do_ioctl+0x0/0x3238) from [<c01d04b4>] (v4l1_compat_get_capabilities+0x1c0/0x25c)
  66. <8>[<c01d02f4>] (v4l1_compat_get_capabilities+0x0/0x25c) from [<c01d14b0>] (v4l_compat_translate_ioctl+0x150/0x238)
  67. <8>[<c01d1360>] (v4l_compat_translate_ioctl+0x0/0x238) from [<c01caa00>] (__video_do_ioctl+0x118/0x3238)
  68. <8>[<c01ca8e8>] (__video_do_ioctl+0x0/0x3238) from [<c01cdcb8>] (__video_ioctl2+0x198/0x2a0)
  69. <8>[<c01cdb20>] (__video_ioctl2+0x0/0x2a0) from [<c01cdddc>] (video_ioctl2+0x1c/0x20)
  70. <8>[<c01cddc0>] (video_ioctl2+0x0/0x20) from [<c009e108>] (vfs_ioctl+0x64/0x74)
  71. <8>[<c009e0a4>] (vfs_ioctl+0x0/0x74) from [<c009e57c>] (do_vfs_ioctl+0x438/0x488)
  72. <8> r6:803c7601 r5:c74766e0 r4:bec77c88 r3:c68aa1b8
  73. <8>[<c009e144>] (do_vfs_ioctl+0x0/0x488) from [<c009e60c>] (sys_ioctl+0x40/0x64)
  74. <8> r9:c74fa000 r8:c002df08 r7:00000003 r6:803c7601 r5:bec77c88
  75. <8>r4:c74766e0
  76. <8>[<c009e5cc>] (sys_ioctl+0x0/0x64) from [<c002dd60>] (ret_fast_syscall+0x0/0x2c)
  77. <8> r7:00000036 r6:00000000 r5:00000140 r4:00009154
  78. <8>Code: ba000002 f5d1f03c f5d1f05c f5d1f07c (e8b151f8)
  79. ---[ end trace 1c239a4a0a70678b ]---

  80. Segmentation fault
如果从这一些信息看出来,是s3c_fimc_v4l2_enum_fmt_vid_cap调用的memcpy中出错,而调用位置在较后的位置(0x4c中0x40处)。查看代码如下:

  1. static int s3c_fimc_v4l2_enum_fmt_vid_cap(struct file *filp, void *fh,
  2. struct v4l2_fmtdesc *f)
  3. {
  4. struct s3c_fimc_control *ctrl = (struct s3c_fimc_control *) fh;
  5. int index = f->index;

  6. if (index >= S3C_FIMC_MAX_CAPTURE_FORMATS)
  7. return -EINVAL;

  8. memset(f, 0, sizeof(*f));
  9. memcpy(f, ctrl->v4l2.fmtdesc + index, sizeof(*f));

  10. return 0;
  11. }
从这里看,比较明显是memcpy碰到空指针了。可以有能是f,也有可以是ctrl(即fh).因此可以,这里一f是应用程序传来,如果有问题,在memset处就出错了,因此只可能是ctrl处为空指地,打印一下,发现
ctrl->v4l2.fmtdesc 空指针。因此加入判断语句

因此修改代码如下
  1. static int s3c_fimc_v4l2_enum_fmt_vid_cap(struct file *filp, void *fh,
  2. struct v4l2_fmtdesc *f)
  3. {
  4. struct s3c_fimc_control *ctrl = (struct s3c_fimc_control *) fh;
  5. int index = f->index;

  6. if (index >= S3C_FIMC_MAX_CAPTURE_FORMATS)
  7. return -EINVAL;

  8. memset(f, 0, sizeof(*f));

  9. if(ctrl->v4l2.fmtdesc == 0) //add by Andrew Huang
  10. return -EINVAL;

  11. memcpy(f, ctrl->v4l2.fmtdesc + index, sizeof(*f));

  12. return 0;
  13. }
修改测试后,果然不出现oops信息,应用程序运行正常.
但深层次的原因没有解决,这里是原因是
ctrl = (struct s3c_fimc_control *) fh,而
fh 是 __video_do_ioctl():void *fh = file->private_data;
而file->private_data;初始化在
static int s3c_fimc_open(struct inode *inode, struct file *filp)()

{
id = MINOR(inode->i_rdev);
ctrl = &s3c_fimc.ctrl[id];

filp->private_data = ctrl;

}

在s3c_fimc.ctrl[].v4l2 的各个指针完全没有初始化。这个当然驱动本身没有完全实现功能。

另外一个同样问题是出现在对v4l1的 VIDIOCGPICT支持问题上。
同样没有初始化,出现除0错误.在除0前判断一下。

  1. static noinline int v4l1_compat_get_picture(
  2. struct video_picture *pict,
  3. struct file *file,
  4. v4l2_kioctl drv)
  5. {
  6. int err;
  7. struct v4l2_format *fmt;

  8. fmt = kzalloc(sizeof(*fmt), GFP_KERNEL);
  9. if (!fmt) {
  10. err = -ENOMEM;
  11. return err;
  12. }

  13. pict->brightness = get_v4l_control(file,
  14. V4L2_CID_BRIGHTNESS, drv);
  15. pict->hue = get_v4l_control(file,
  16. V4L2_CID_HUE, drv);
  17. pict->contrast = get_v4l_control(file,
  18. V4L2_CID_CONTRAST, drv);
  19. pict->colour = get_v4l_control(file,
  20. V4L2_CID_SATURATION, drv);
  21. pict->whiteness = get_v4l_control(file,
  22. V4L2_CID_WHITENESS, drv);

  23. fmt->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  24. err = drv(file, VIDIOC_G_FMT, fmt);
  25. if (err < 0) {
  26. dprintk("VIDIOCGPICT / VIDIOC_G_FMT: %d\n", err);

  27. goto done;
  28. }


  29. if(fmt->fmt.pix.width >0) //add by Andrew Huang
  30. pict->depth = ((fmt->fmt.pix.bytesperline << 3)
  31. + (fmt->fmt.pix.width - 1))
  32. / fmt->fmt.pix.width;

  33. printk(KERN_WARNING "hxy %s:02\n",__func__);

  34. pict->palette = pixelformat_to_palette(
  35. fmt->fmt.pix.pixelformat);
  36. done:
  37. kfree(fmt);
  38. return err;
  39. }


3.oops进一步处理

如果需要进一步处理,可以用dmesg 把原始的oops导入到一个文本文件当中,用应用程序工具 ksymoops 来操作.但一般这个对桌面版的LINUX比较有效

ksymoops 需要几项内容:Oops 消息输出、来自正在运行的内核的 System.map 文件,还有 /proc/ksyms、vmlinux 和 /proc/modules。关于如何使用 ksymoops,内核源代码 /usr/src/linux/Documentation/oops-tracing.txt 中或 ksymoops 手册页上有完整的说明可以参考。Ksymoops 反汇编代码部分,指出发生错误的指令,并显示一个跟踪部分表明代码如何被调用。

4.扩展阅读:

<<掌握 Linux 调试技术 -- 在 Linux 上找出并解决程序错误的主要方法>>
http://www.ibm.com/developerworks/cn/linux/sdk/l-debug/index.html
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/mozun1/article/details/53259167

智能推荐

nagiosQL访问时报错PHP message: PHP Deprecated: preg_replace(): The /e modifier is deprecated, use preg_re-程序员宅基地

文章浏览阅读3.2k次。nagiosQL安装环境:CentOS release 6.4 (Final)php-5.5.4nagiosql_320nginx version: nginx/1.2.3 安装一切正常,当访问nagiosQL界面时会提示:PHP Deprecated: preg_replace(): The /e modifier is deprecat_php message: php deprecated

海思sdk问题_海思sdk里面的sample在make时出现链接错误-程序员宅基地

文章浏览阅读1.1k次。make[2]: Entering directory '/hisi/soft/board/Hi3516A_SDK_V1.0.7.0/osdrv/tools/pc/jffs2_tool/tmp/mtd-utils-2.0.1'make[2]: *** No targets specified and no makefile found. Stop.make[2]: Leaving dir_海思sdk里面的sample在make时出现链接错误

tomcat 内存配置优化 Xms Xmx_不设置xmx xms-程序员宅基地

文章浏览阅读2.7k次。考虑一下这种场景,你开发了一个应用,它有十分优秀的布局设计,最新的特性以及其它的优秀特点。但是在性能这方面欠缺,不管这个应用如何都会遭到客户拒绝。客户总是期望它们的应用应该有更好的性能。如果你在产品中使用了Tomcat服务器,那么这篇文章就会给你几方面来提升Tomcat服务器的性能。感谢ITWorld article给本文提供资源。经过沉思我已经知道了和早期版本相比最新的Tomcat提供更好的_不设置xmx xms

connection如何释放-程序员宅基地

文章浏览阅读1.3k次。可以把session与connection的使用关系分为三种 session使用的连接是被提供的,常常SessionFactory.openSession(connection,Interceptor?) session使用的连接被借给客户端,常常session.connection session通过connectionProvider.getConnection得到的连接..._sqlsessionfactory获取的connection用完如何释放

LTE的信道_lte各种信道-程序员宅基地

文章浏览阅读2.9k次,点赞7次,收藏36次。前言 信道是不同类型的信息,按照不同传输格式、用不同的物理资源承载的信息通道。根据信息类型的不同、处理过程的不同可将信道分为多种类型。 本文重点介绍LTE的逻辑信道、传输信道、物理信道等常见的信道类型,并和3G相应的信道类型作了比较,通过比较可以加深LTE信道结构的理解。最后给出LTE从逻辑信道到传输信道,再到物理信道的映射关系。依据不同的货物类型,采用不同的处理工..._lte各种信道

在python中最常见的:print的真正用法_print(*a, sep=' ')-程序员宅基地

文章浏览阅读751次。一、print()函数概述print() 方法用于打印输出,是python中最常见的一个函数。该函数的语法如下:print(*objects, sep=' ', end='\n', file=sys.stdout)参数的具体含义如下: objects --表示输出的对象。输出多个对象时,需要用 , (逗号)分隔。 sep -- 用来间隔多个对象。 end..._print(*a, sep=' ')

随便推点

AntV G6中动态数据提示框的实现_antv-g6弹窗-程序员宅基地

文章浏览阅读5.9k次,点赞12次,收藏17次。使用坐标变换实现antvG6中自定义tooltip_antv-g6弹窗

C++入门基础(十一) STL介绍_stl全称-程序员宅基地

文章浏览阅读473次。在学习完之间C++模板的相关知识之后,我们仿佛打开了一个新世界的大门,原来代码还可以这样用,但是问题又来了,即使是有模板了但是这个模板还要写出来,这样是不是太麻烦了,好像还没有到达懒的真正境界,那么为了满足大部分懒人的需要,惠普实验室来了一手绝活,他们将大量的函数模板、算法等等全部进行总结归纳,编写写成了一个巨大的仓库,这样程序员们在使用时只要调用相关函数接口便可以省下大把的头发,这个库就是我们长常说的STL标准模板库。_stl全称

python基础(一)_jetbrains pycharm 2017.2.3 x64-程序员宅基地

文章浏览阅读336次。1.简介python 汉译: 蟒蛇发展史: 于1989年 由荷兰人吉多·范罗苏姆。 第一个公开发行版发行于 1991 年。像 Perl 语言一样, Python 源代码同样遵循 GPL(GNU General Public License) 协议。现在 Python 是由一个核心开发团队在维护,Guido van Rossum 仍然占据着至关重要的作用,指导其进展。Python 2...._jetbrains pycharm 2017.2.3 x64

Android广播机制_android 中的广播机制-程序员宅基地

文章浏览阅读855次。1.Android广播机制概述Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器)。广播作为Android组件间的通信方式,可以使用的场景如下:1.同一app内部的同一组件内的消息通信(单个或多个线程之间);2.同一app内部的不同组件之间的消息通信(单个进程);3.同一app具有多个进程_android 中的广播机制

Android中将webp格式图片转换为png和jpg(续)_手机图片webp转换jpg-程序员宅基地

文章浏览阅读7.8k次。上一篇《Android将webp格式图片转换为png格式方法》在app上线后,部分机型报出了bug,比如华为手机,会在包含静态库的页面中直接报错奔溃,经过反复调试发现网上下载的libweb.so 之前打包的时间有点早,对高版本的系统和cpu类型支持不好,所以在github上找了一个项目,配置到gradle:2.3.1,APP_ABI := all全CPU类型,相关SO压缩文件已经放到我的下载资源里_手机图片webp转换jpg

洛谷 P5487 【模板】线性递推+BM算法(BM+多项式取模)_洛谷 bm-程序员宅基地

文章浏览阅读907次。传送门代码:#include<bits/stdc++.h>#define ri register intusing namespace std;const int rlen=1<<18|1;inline char gc(){ static char buf[rlen],*ib,*ob; (ib==ob)&&(ob=(ib=buf)+fread..._洛谷 bm