Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过更改Makefile中的源文件顺序而导致/避免的分段错误_C++_Makefile_Arm_Embedded_Cortex M3 - Fatal编程技术网

C++ 通过更改Makefile中的源文件顺序而导致/避免的分段错误

C++ 通过更改Makefile中的源文件顺序而导致/避免的分段错误,c++,makefile,arm,embedded,cortex-m3,C++,Makefile,Arm,Embedded,Cortex M3,我在一个嵌入式平台上开发软件,不断地遇到(对我来说)难以解释的分段错误。我希望从你们这些有更多嵌入式平台经验的人那里得到一些调试想法。我在谷歌搜索中找不到任何有用的信息 详情: 使用GCC-ARM工具链编译的C++程序(4.9.3) ARM Cortex-M3处理器(如果您感兴趣,请在LPC1768开发板上) 我可以通过修改源文件的构建顺序(即Makefile中的文件顺序)来防止分段错误。这种文件顺序基本上是任意的 分段错误总是发生在类构造函数中类对象的实例化期间,并且发生在程序启动期间(在到

我在一个嵌入式平台上开发软件,不断地遇到(对我来说)难以解释的分段错误。我希望从你们这些有更多嵌入式平台经验的人那里得到一些调试想法。我在谷歌搜索中找不到任何有用的信息

详情:

  • 使用GCC-ARM工具链编译的C++程序(4.9.3)
  • ARM Cortex-M3处理器(如果您感兴趣,请在LPC1768开发板上)
  • 我可以通过修改源文件的构建顺序(即Makefile中的文件顺序)来防止分段错误。这种文件顺序基本上是任意的
  • 分段错误总是发生在类构造函数中类对象的实例化期间,并且发生在程序启动期间(在到达main()之前)
  • 如果我注释掉出现segfault的给定类构造函数中的代码,segfault将出现在其他类对象实例化(当然是另一个类)的构造函数中
我不知所措。看起来对象实例化正在写入其他内存以导致SEGFULT,但是内核不应该阻止吗?这里我不是直接写入内存,我只是在做一个普通的对象实例化

我猜:我相信我已经读过基于ARM的体系结构将ROM和RAM放在同一个闪存块上。更改文件生成顺序会更改ROM中对象的顺序。启动时,RAM块中的上述对象实例化会无意中覆盖一些ROM内存。在一种源文件顺序的情况下,被覆盖的内存无关紧要,因此不会触发segfault,而在另一种情况下,它无关紧要,并且会触发segfault

这一猜测可能揭示出我对故障处理程序的工作方式知之甚少。请原谅我对嵌入式平台的无知

对我可能调查的事情有什么想法吗?这类问题是特定源或Makefile错误的特征吗

以下是两个SEGFULTS示例:

Program received signal SIGSEGV, Segmentation fault.
0x00003cde in HardFault_Handler ()
(gdb) where
#0  0x00003cde in HardFault_Handler ()
#1  <signal handler called>
#2  dataComm::dataComm (this=0x10000218 <dc>) at dataComm/dataComm.cpp:12
#3  0x000002e6 in __static_initialization_and_destruction_0 (
    __initialize_p=1, __priority=65535) at main.cpp:22
#4  _GLOBAL__sub_I_dataIn () at main.cpp:87
#5  0x00006b32 in __libc_init_array ()
#6  0x0000016e in _start ()
#7  0x0000016e in _start ()
Backtrace stopped: previous frame inner to this frame (corrupt stack?)
程序接收信号SIGSEGV,分段故障。
硬故障处理程序()中的0x00003code
(gdb)在哪里
#硬故障处理程序()中的0 0x00003code
#1  
#dataComm/dataComm.cpp:12处的2 dataComm::dataComm(this=0x10000218)
#3 0x000002e6在静态初始化和销毁中(
__在main.cpp:22处初始化(p=1,优先级=65535)
#main.cpp:87处的4个全局子数据输入()
#5 0x00006b32 in_uulibc_init_数组()
#6 0x0000016e in_启动()
#7 0x0000016e in_启动()
回溯已停止:此帧内部的上一帧(堆栈损坏?)

程序接收信号SIGSEGV,分段故障。
硬故障_处理程序()中的0x00003586
(gdb)在哪里
#硬故障_处理程序()中的0 0x00003586
#1  
#2个spi_格式的0x00004f94()
#mbed::SPI::aquire()中的3 0x000044d2()
#FSM中的4 0x0000205e::FSM(此=0x1000070c)
最终测试时机器/FSM。cpp:54
#5 0x0000097c输入静态初始化和销毁0(
__在initExoVars/initExoVars.cpp:37处初始化(p=1,u优先级=65535)
#initExoVars/initExoVars.cpp:215处的6 GLOBAL_uuusub_I_xtleft()
#7 0x000060A在uu libc_init_数组中()
#8 0x0000016e in_启动()
#9 0x0000016e in_启动()
回溯已停止:此帧内部的上一帧(堆栈损坏?)

此外:这看起来不像是Make的错。这看起来就像是代码中的某个地方发生了可见错误,而坏事情已经在其他地方悄无声息地发生了,这通常是堆损坏的迹象。你有没有可能给我们一个答案?Makefile中源文件的顺序不应该影响程序的执行。编译顺序在很大程度上取决于make在解析Makefile时构建的依赖树。我建议跨编译单元检查所有全局作用域静态声明,看看初始化顺序是否会影响。尝试消除全局范围静态声明。您使用的是Cortex-M3-您没有MMU,并且无法保证内核(如果确实存在符合该描述的内容)使用MPU强制执行任何内存保护。所以你的链接顺序可能会影响到什么代码会被一个散乱的指针覆盖。听起来你没有足够的内存来存储。数据部分。切换文件的顺序,使某些初始值设定项先存储在其他初始值设定项之前,而这些初始值设定项不会导致分段错误或在启动时不使用。
Program received signal SIGSEGV, Segmentation fault.
0x00003586 in HardFault_Handler ()
(gdb) where
#0  0x00003586 in HardFault_Handler ()
#1  <signal handler called>
#2  0x00004f94 in spi_format ()
#3  0x000044d2 in mbed::SPI::aquire() ()
#4  0x0000205e in FSM::FSM (this=0x1000070c <fsm>)
    at FiniteStateMachine/FSM.cpp:54
#5  0x0000097c in __static_initialization_and_destruction_0 (
    __initialize_p=1, __priority=65535) at initExoVars/initExoVars.cpp:37
#6  _GLOBAL__sub_I_txtLeft () at initExoVars/initExoVars.cpp:215
#7  0x0000606a in __libc_init_array ()
#8  0x0000016e in _start ()
#9  0x0000016e in _start ()
Backtrace stopped: previous frame inner to this frame (corrupt stack?)