• 上一篇我有相关关于一个段错误的记录,现在记录当时的段错误具体是在哪里的。

    // 从 GNU 的官网下载当前在使用的 glibc 的源代码以及最新的 glibc 源代码
// 地址如下: http://ftp.gnu.org/gnu/libc/
// 下载的是 glibc-2.12.2.tar 以及最新的 glibc-2.25.tar 两个版本
// 这里要记住, glibc 2.12.2 这个版本是有一个bug 的, times 的参数不能传 NULL。
    //  解压  glibc-2.12.2.tar
tar -xvf glibc-2.12.2.tar.gz
cd glibc-2.12.2
vim sysdeps/unix/sysv/linux/times.c
    // 这个文件中的一段代码会导致程序调用了 times 运行一段时间后会产生段错误
clock_t
__times (struct tms *buf)
{
INTERNAL_SYSCALL_DECL (err);
clock_t ret = INTERNAL_SYSCALL (times, err, 1, buf);
if (INTERNAL_SYSCALL_ERROR_P (ret, err)
&& __builtin_expect (INTERNAL_SYSCALL_ERRNO (ret, err) == EFAULT, 0))
{ // 这里如果传的 buf == NULL 的话,也会执行里面的操作。
/* This might be an error or not. For architectures which have
no separate return value and error indicators we cannot
distinguish a return value of -1 from an error. Do it the
hard way. We crash applications which pass in an invalid BUF
pointer. */
#define touch(v) \
do { \
clock_t temp = v; \
asm volatile ("" : "+r" (temp)); \
v = temp; \
} while (0)
touch (buf->tms_utime);
// 如果是 NULL->tms_utime 可能在运行一段时候后产生段错误
touch (buf->tms_stime);
touch (buf->tms_cutime);
touch (buf->tms_cstime); /* If we come here the memory is valid and the kernel did not
return an EFAULT error. Return the value given by the kernel. */
} /* Return value (clock_t) -1 signals an error, but if there wasn't any,
return the following value. */
if (ret == (clock_t) -1)
return (clock_t) 0; return ret;
}
    //  对比了最新版的 glibc , 他已经修改了对应的代码
28 if (INTERNAL_SYSCALL_ERROR_P (ret, err)
29 && __builtin_expect (INTERNAL_SYSCALL_ERRNO (ret, err) == EFAULT, 0)
30 && buf)
// 这里对 buf 进行了判断, 如果为 buff 为真才进去。
  • 目前我的解决方式是用 以前交叉编译器里面的的glibc.so.6 , 暂时运行还未出现问题。

  • 但是使用了之前的 glibc 之后,发现 gdb 不能使用,所以又将 gdb 用以前的交叉编译器编译了一次。

  • 过程如下:

    //  第一步是下载 gdb 的源码以及 ncurses 的源码 以及 termcap 的源码
gdb 下载地址 : http://ftp.gnu.org/gnu/gdb/
gdb 我是下载了一个比较保守的版本 7.2 ,我怕比较新的有问题。 ncurses 下载地址: http://ftp.gnu.org/pub/gnu/ncurses/ncurses-5.8.tar.gz
termcap 下载地址: http://ftp://ftp.gnu.org/gnu/termcap/termcap-1.3.1.tar.gz
  • 解压相关源代码

    tar -xvf termcap-1.3.1.tar.gz
tar -xvf gdb-7.2a.tar.bz2
  • 交叉编译 termcap

    cd termcap-1.3.1/
mkdir output
vim my.sh
#!/bin/sh ./configure --target=arm-none-linux-gnueabi --prefix=/home/sbc_7816_sdk6/test/gdb/termcap-1.3.1/output
    chmod +x my.sh
./my.sh
make
make install
    将 output/lib  下面的库copy 到交叉编译器的  lib 里面, include  也是
cp output/lib/libtermcap.a /home/sbc_7816_sdk6/aplex/linux-devkit/usr/local/arm/4.3.2/arm-none-linux-gnueabi/lib
cp output/include/termcap.h /home/sbc_7816_sdk6/aplex/linux-devkit/usr/local/arm/4.3.2/arm-none-linux-gnueabi/include/
  • 交叉编译 gdb

    cd ~/test/gdb/gdb-7.2/
mkdir output
vim my.sh
#!/bin/sh ./configure --target=arm-linux --host=arm-linux --prefix=/home/sbc_7816_sdk6/test/gdb/gdb-7.2/output
    chmod +x my.sh
./my.sh
make
make install
     将生成的 output/bin  里面的 gdb  gdbserver  拷贝到 目标文件系统的  /usr/bin 下面,要覆盖
    完成

记录一个glibc 导致的段错误以及gdb 移植的更多相关文章

  1. 记录一个原因不明的段错误(libxml2 proc activemq的三角恋)

    又碰到了令人头疼的段错误,但是这次,虽然最终找到了出自何处,但是还是不明白究竟是为何. 最后将程序简化,贴上来,希望高人能指点一下. memt.pc: #include <libxml/pars ...

  2. memset 导致的段错误(segmentation fault)

    在调试Minixml库时,定义了一个结构体: struct ssid_info_s{ std::string wl_ssid_name; std::string wl_ssid_mac; std::s ...

  3. Linux段错误及GDB Coredump调试方法

    最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间最长的问题就是著名的“段错误”(Segmentation Fa ...

  4. memset 导致的一个段错误

    原型: void *memset(void *s, int c, size_t n); 解释: memset :是 逐字节 拷贝,即n是指整个变量所占字节,在用于数组时一定要注意n不一定是 数组元素. ...

  5. linux下cp覆盖原so文件时引起的段错误原因确定

    原创作品,转载请注明出处http://www.cnblogs.com/leo0000/p/5694416.html 最近因为一个很有意思的段错误学习了一些新的东西. 当时现象是这样的,程序正在运行,系 ...

  6. Linux 下段错误 core文件

    什么是core dump? core的意思是内存,dump的意思是扔出来,堆出来:当一个程序奔溃时,在进程当前工作目录的core文件中复制了该进程的存储图像.core文件仅仅是一个内存映像(同时加上调 ...

  7. 记录一个bootstrap惨痛的错误

    记录一个bootstrap的错误,这个错误因为我删除了一个class就导致了页面上显示的错误,这是一个惨痛的教训,特此记录,提醒自己在做前端的修改时,一定要慎之又慎.如果真的要做改动,改完之后也要测一 ...

  8. 用户态使用 glibc/backtrace 追踪函数调用堆栈定位段错误【转】

    转自:https://blog.csdn.net/gatieme/article/details/84189280 版权声明:本文为博主原创文章 && 转载请著名出处 @ http:/ ...

  9. 【C语言】 strlen()入参空指针导致段错误

    背景: 在工作中调试sqlite3相关代码的时候,调用printf()打印sqlite3_exec()的执行日志:因为sqlite3_exec()保存日志的参数传入时为NULL,且没有执行错误,所以再 ...

随机推荐

  1. java学习笔记15--多线程编程基础2

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡 ...

  2. Kotlin(2): 优雅地扩展类的方法和属性

    欢迎Follow我的GitHub, 关注我的CSDN. 个人博客: http://www.wangchenlong.org/, 最新内容. Kotlin由JetBrains公司推出, 是兼容Java的 ...

  3. 【转】js-ES6学习笔记-Symbol

    原文:https://www.cnblogs.com/zczhangcui/p/6435652.html https://blog.mgechev.com/2017/09/16/developing- ...

  4. 全民Scheme(2):来自星星的你

    一门编程语言,假设不能对你思考编程的方式产生影响.就不值得去学习.--  Alan Perlis (define rember*   (lambda (a list)     (cond       ...

  5. JDK中枚举的底层实现

    前提 上一篇文章复习介绍了JDK中注解的底层实现,跟注解一样比较常用,但是底层实现比较神秘的还有枚举类型.趁着国庆假期的最后两天,把JDK中枚举的底层实现也进行一次探究. 通过例子查找本质 在探究JD ...

  6. Jquery重新学习之八[Ajax运用总结B]

    上一篇简单介绍普通javascript以及Jquery的AJAX方法,其中Jquery.ajax()是功能比较强悍的底层方法,可以更多地关注实现过程中的细节:除Jquery.ajax()方法外,Jqu ...

  7. Android-PullToRefresh(一)

    先讲下这篇写啥东西,也就是这家伙(chrisbanes)写的一个上拉下拉刷新的Demo,连接https://github.com/fengcunhan/Android-PullToRefresh 东西 ...

  8. 轻轻的我走了,正如我轻轻的来——Duilib无焦点窗体的实现

    在Windows编程中,我们已经习惯了一个窗体从创建到显示并获得焦点. 我们总感觉一个窗体创建出来获得焦点是理所理所当然的.一个窗体仅仅要显示就必须获得焦点.一个新窗体显示时.会收到到WM_SETFO ...

  9. knockoutjs -- applyBinding & Observables

    applyBindings ko.applyBindings(myViewModel); // Knockout调用applyBindings激活myViewModel(即把myViewModel和V ...

  10. Spring 切面优先级

    之前我们提过的应用场景,一个原始对象可能会需要插入多个切面,如果我们按前几篇博客文章介绍的方法完成切面及其通知的注解声明,那么它的执行顺序是怎么样的呢? 本文将介绍AspectJ的切面如何划分优先级 ...