程序core了,看到的还是问号

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序core了,看到的还是问号相关的知识,希望对你有一定的参考价值。

参考技术A C程序发布的时候,经常去掉-g编译选项的,那么这就遇到一个问题,当程序运行core dump后,想去调试查看core的具体信息,会发现很多符号都被优化掉了,看到的栈信息要么是问号,要么变量无法打印值; 去掉符号表,却可以让程序体积更小,而且不容易泄漏程序的信息,更安全些。

这就产生了矛盾,我们在运行的时候不需要符号表,调试的时候需要符合表,那我们能否把符号表在发布程序的时候删除,调试的时候加载符号表信息那,这样就满足了需要。

为了直观起见,先写个简单的c代码用于演示,代码如下:

编译下:

gdb调试看看:

可以看到显示没有调试符号表信息,我们重新用-g编译选项试试:

其实也不是完全没有符号,也还是有不少的,只是没有调试信息,可以用命令查看:

两个符号表的大小是有差距的差距6个,这个表示符号表的index的个数。 查下段表更清晰:

编译的时候可以采用-g编译,然后发布的时候去掉符号表,可以使用命令:strip。 如下最简单的处理下:

可以看到strip处理过的testdebug,比不用-g 选项的编译出来的test文件更小,通过nm命令验证下,确实任何符号都被删除了,而不用-g编译的文件还可以看到符号信息的。

默认情况下不会产生core文件,加大core文件尺寸:

重新编译运行:

看下core的信息:

调试下看看:

因为没有符号信息,很可惜看不到具体的符号信息,也不知道在哪里core了。

看重点,加载符号文件,这个是直接加载没有strip前的文件,是包含符号表的。我们清晰的可以看到core的位置是在第8行。

我们通过命令: eu-strip testdebug -f testdebug.sym 提取testdebug中的符号表,保存为文件testdebug.sym。

我们gdb调试的时候导入这个符号试试:

Java web为啥输入的中文还是显示问号?text目录下的东西跟workspace得改的都改了

你好,这是 GET方式传递中文参数乱码问题,非常的常见,很简单。

在获取到的 name 字符串后边调用这个方法处理一下试试看
name = java.net.URLDecoder.decode(name,"UTF-8");
System.out.println(name);

原因是,前端网页get方法传输参数的时候,URL中的中文会自动的编码(因为URL中不能包含中文),所以你在后端java程序中收到参数后,需要将被编码的中文进行一次解码的操作。
以上的代码,就是对接收到的中文做了解码。
希望能够帮到你!
参考技术A 你的编码转换可能出来问题,检查编码设置。

以上是关于程序core了,看到的还是问号的主要内容,如果未能解决你的问题,请参考以下文章

解决gdb 调试 core 文件函数名显示为问号的问题

C++ gdb core调试 崩溃日志 都是问号??

gdb调试程序函数名为问号,啥原因?

快速选择器视图,数字显示问号

PLSQL中table表中的汉字显示问号,装了汉化包之后还是问号,不知道怎么解决

ghidra DAT_* 中的问号