我已经在我的应用程序在嵌入式Arm Linux平台上运行的问题上工作了几天.不幸的是,该平台使我无法使用任何常用的有用工具来查找确切的问题.当在运行Linux的PC上运行相同的代码时,我没有遇到这样的错误.
在下面的示例中,我可以通过取消注释字符串,列表或矢量线来可靠地重现问题.让它们留下评论会导致应用程序运行完成.我希望有什么东西会破坏堆,但是我看不到什么?在发出分段错误之前,程序将运行几秒钟.
代码使用arm-linux交叉编译器编译:
arm-linux-g++ -Wall -otest fault.cpp -ldl -lpthread
arm-linux-strip test
Run Code Online (Sandbox Code Playgroud)
任何想法都非常感激.
#include <stdio.h>
#include <vector>
#include <list>
#include <string>
using namespace std;
/////////////////////////////////////////////////////////////////////////////
class TestSeg
{
static pthread_mutex_t _logLock;
public:
TestSeg()
{
}
~TestSeg()
{
}
static void* TestThread( void *arg )
{
int i = 0;
while ( i++ < 10000 )
{
printf( "%d\n", i );
WriteBad( "Function" );
}
pthread_exit( NULL );
}
static void WriteBad( const char* sFunction )
{
pthread_mutex_lock( &_logLock );
printf( …Run Code Online (Sandbox Code Playgroud) 当std :: exception引发时,如何打印完整的调用堆栈?
通过远程日志记录库记录使程序崩溃的分段错误和运行时错误的技术是什么?
语言是C ++。
帖子" 当我的gcc C++应用程序崩溃时如何生成堆栈跟踪"解释了当应用程序崩溃时如何生成堆栈跟踪.但是gcc版本在Windows MinGW上不起作用.事实上它甚至没有编译,因为缺少标头execinfo.h.
在Windows XP及更高版本上是否有可用于MinGW的东西?
编辑
通过下面提到的步骤可以实现Stackwalking.但是当我在异常之后尝试在catch块中遍历堆栈时,我没有得到所需的结果.我只能获取抛出异常的函数的名称,然后它显示list - > main - >等等
脚步 :
第一个答案提供给Win32 API堆栈与MinGW/MSYS一起走?作者:JoséLuisCebrián创建了一个链接,可以找到Mr.Edd的堆栈跟踪库http://www.mr-edd.co.uk/code/stack_trace
上面链接中提供的stackwalker依赖于dbghelp.dll.由于MinGW没有为此提供导入库,因此它是使用mingw的dlltool生成的.命令是
dlltool -k -d dbghelp.def -l dbghelp.a
注1:在Wine项目中找到.def文件
注意2:库生成不适用于所有版本的MinGW.我在使用4.4.1版本生成它时遇到了问题,但它在4.6.1中运行良好
库-lbfd,-lintl和-liberty也用于与-ldbghelp一起链接
结构化异常处理使用链接 http://www.programmingunlimited.net/siteexec/content.cgi?page=mingw-seh
代码视图
"尝试"实施如下.此部分注册异常处理程序
{
__SEH_EXCEPTION_REGISTRATION _lseh_er;
__SEH_HANDLER _lseh_handler;
_lseh_er.handler =
reinterpret_cast<PEXCEPTION_HANDLER>(__SEH_HANDLER::ExceptionRouter);
_lseh_er.exthandler = &_lseh_handler;
asm volatile ("movl %%fs:0, %0" : "=r" (_lseh_er.prev));
asm volatile ("movl %0, %%fs:0" : : "r" (&_lseh_er));
int _lseh_setjmp_res = setjmp(_lseh_handler.context);
while(true) {
if(_lseh_setjmp_res != 0) {
break;
}
Run Code Online (Sandbox Code Playgroud)ExceptionRounter函数调用另一个函数ExceptionHandler,其中复制了上下文和记录.实施如下.
EXCEPTION_DISPOSITION __SEH_HANDLER::ExceptionHandler(PEXCEPTION_RECORD pRecord,
__SEH_EXCEPTION_REGISTRATION* …Run Code Online (Sandbox Code Playgroud)所以我在代码的开头出现了分段错误错误.我尝试在不同的点运行一些测试,错误似乎是我为数组分配内存.我刚刚开始学习堆和堆栈内存,所以我不确定我是否在那里做错了.任何帮助,将不胜感激.
#include <iostream>
using namespace std;
//Function Prototypes
void sort(int A[], int n);
int findMin(int A[], int n, int j);
int swap(int& a, int& b);
double median(int A[], int n);
void output1(int median);
void output2(double median);
int main()
{
int size;
int array[size]; //Segmentaion fault here
int i = 0;
cout << "Enter the size of the list (< 1 to quit): ";
cin >> size;
while(size >= 1)
{
double element;
cout << "Enter element " << i+1 << …Run Code Online (Sandbox Code Playgroud) 我需要在运行的进程中获取堆栈的基地址。这将使我能够打印将由addr2line理解的原始堆栈跟踪(已剥离运行二进制文件,但addr2line可以访问符号)。我通过检查以下内容的elf标头成功做到了这一点argv[0]:我读取了入口点并将其从中减去&_start:
#include <stdio.h>
#include <execinfo.h>
#include <unistd.h>
#include <elf.h>
#include <stdio.h>
#include <string.h>
void* entry_point = NULL;
void* base_addr = NULL;
extern char _start;
/// given argv[0] will populate global entry_pont
void read_elf_header(const char* elfFile) {
// switch to Elf32_Ehdr for x86 architecture.
Elf64_Ehdr header;
FILE* file = fopen(elfFile, "rb");
if(file) {
fread(&header, 1, sizeof(header), file);
if (memcmp(header.e_ident, ELFMAG, SELFMAG) == 0) {
printf("Entry point from file: %p\n", (void *) header.e_entry);
entry_point = (void*)header.e_entry;
base_addr = …Run Code Online (Sandbox Code Playgroud) 我意识到这将是特定于平台的:是否有任何方法可以从未捕获的C ++异常中获取堆栈跟踪,但是从抛出异常的那一点来看呢?
我有一个Windows结构化异常处理程序来捕获访问冲突等,并生成一个小型转储。但是当然,由于未捕获的C ++异常而在终止事件中不会调用该函数,因此没有崩溃转储。
我目前正在寻找Windows解决方案(无论多么肮脏!),但如果可能,希望了解其他平台。
谢谢。
我正在构建一个C++程序,我需要处理SIGSEGV,而Signal处理程序应该能够打印Back Trace.任何人都可以帮忙.
问候
寻找一种快速而又脏的方法来识别构造函数的调用者(或任何函数)我正在编写宏来帮助通过转储this指针来识别内存泄漏OutputDebugString.
知道调用ctor和dtor的位置有助于识别问题.
tnx\0
我按照这篇文章打印堆栈跟踪如何在我的gcc C++应用程序崩溃时生成堆栈跟踪.它在x86 linux中运行良好.任何人都可以教我如何使它在arm-linux上运行?
我正在使用arm-linux-gcc 4.4.3.
[root@FriendlyARM /]# ./test1
Error: signal 11:
[0x0]
Run Code Online (Sandbox Code Playgroud)
在x86中
mickey@mickeyvm:~/Desktop/workspace/test/testCatchSeg/src$ ./test1
Error: signal 11:
./test1(_Z7handleri+0x19)[0x804876d]
[0xedd400]
./test1(_Z3bazv+0x10)[0x80487c2]
./test1(_Z3barv+0xb)[0x80487e1]
./test1(_Z3foov+0xb)[0x80487ee]
./test1(main+0x22)[0x8048812]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x84de37]
./test1[0x80486c1]
Run Code Online (Sandbox Code Playgroud)
这就是我为arm-linux编译的方法
arm-linux-g++ -g -rdynamic ./testCatchSeg.cpp -o testCatchSeg
Run Code Online (Sandbox Code Playgroud) 假设在接收和处理信号时,在main方法内正在运行一个进程。信号处理程序完成后,该过程是否返回到接收信号的main中的行,还是返回到信号调用?
PS:我知道自己可以快速进行测试,但是当我无法使用PC时,这种想法就发生了。
谢谢。
没有运行GDB,只有程序本身.
编辑:我已经看过这样的程序,但我无法想象自己该怎么做:(