这个问题很可能重复使用来自Cygwin可执行文件的stackdump - 但我是初学者,我不理解答案,甚至是部分问题.
我是c ++和编程的新手,我在NetBeans中开发.我正在编写一些编译得很好的代码,但是在运行时失败了.如果我使用调试器,我会收到以下错误:
1 [main] all 6200 exception::handle: Exception: STATUS_ACCESS_VIOLATION
881 [main] all 6200 open_stackdumpfile: Dumping stack trace to all.exe.stackdump
Run Code Online (Sandbox Code Playgroud)
我已经设法找到文件all.exe.stackdump,我可以通过记事本++阅读它,但我不明白这是什么意思.我通过另一个问题收集到有一种用户友好的方式来解码这个文件,但我最好的猜测bash$ gdb all.exe.stackdump是无效的.在调试中使用此文件的最佳方法是什么?
为了防止它有用,这里是all.exe.stackdump的内容
Exception: STATUS_ACCESS_VIOLATION at eip=00434C41
eax=2003A2E4 ebx=0028A95C ecx=00000000 edx=0028A95C esi=0028A9B0 edi=00000000
ebp=0028A9C8 esp=0028A930 program=[redacted for privacy/security], pid 6200, thread main
cs=0023 ds=002B es=002B fs=0053 gs=002B ss=002B
Stack trace:
Frame Function Args
0028A9C8 00434C41 (00000000, 2003A4F0, 0028A9E8, 00000000)
0028A9E8 00436B14 (00000000, 2003A4F0, 0028AA28, 0028D000)
0028AAF8 004036A4 (0028AB80, 2003A2B0, 00000014, 00000003)
0028ABD8 00403FBC (00000001, …Run Code Online (Sandbox Code Playgroud) 默认情况下,使用Hotspot,CTRL-Break线程转储不会列出哪些线程持有java.lang.concurrent锁.我理解,使用这些锁,Hotspot无法获得有关获取锁的堆栈帧的信息.如果添加JVM选项-XX:+PrintConcurrentLocks,则CTRL-Break堆栈转储将列出(在线程的堆栈跟踪之后)该帧持有的任何并发锁定.例如:
"D-Java-5-Lock" prio=6 tid=0x00000000069a1800 nid=0x196c runnable [0x000000000770f000]
java.lang.Thread.State: RUNNABLE
at com.Tester.longDelay(Tester.java:41)
at com.Tester$D.run(Tester.java:88)
Locked ownable synchronizers:
- <0x00000007d6030898> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
Run Code Online (Sandbox Code Playgroud)
没有这个选项,就不可能弄清楚在验尸中持有这个锁的线程.为什么此选项不是默认选项?是否存在一些不明显的性能或稳定性惩罚?当我寻找对此的讨论时,什么也没有出现.
应用程序[rtorrent]崩溃后,它生成core文件,250MB.
Caught Segmentation fault, dumping stack:B] [Port: 58940][U 0/0] [D 0/10] [H 1/32] [S 72/75/768] [F 0/128]
Stack dump not enabled.
Aborted (core dumped)
Run Code Online (Sandbox Code Playgroud)
我需要的是分析和查看堆栈跟踪,以便了解为什么rtorrent经常崩溃.
gcc 4.4.3 c89
我有以下源代码.并在printf上获得堆栈转储.
char **devices;
devices = malloc(10 * sizeof(char*));
strcpy(devices[0], "smxxxx1");
printf("[ %s ]\n", devices[0]); /* Stack dump trying to print */
Run Code Online (Sandbox Code Playgroud)
我想这应该创建一个这样的char数组.
devices[0]
devices[1]
devices[2]
devices[4]
etc
Run Code Online (Sandbox Code Playgroud)
每个元素我都可以存储我的字符串.
非常感谢任何建议,
==增加了更正===
for(i = 0; i < 10; i++)
{
devices[i] = malloc(strlen("smxxxx1")+1);
}
Run Code Online (Sandbox Code Playgroud) 我是 cygwin(和 linux)的新手。
当我尝试运行基于 C 语言的可执行文件时,发生了分段错误,并且我获取了 stackdump 文件。但是,我不知道如何使用它进行调试。
我一直在寻找如何使用 stackdump 文件进行调试的方法,但我找不到。任何小技巧对我都非常有用。感谢您阅读我糟糕的英语(英语不是我的第一语言)。
首先,我2个月前才开始编程C/C++(但是有更多的Java经验),所以我对C/C++的经验很少.我正在撰写一篇论文,并正在使用/扩展为此目的而为之前的研究编写的其他代码.
现在,这个错误肯定是我遇到的最奇怪的事情,花了我差不多3个小时才找到并缩小到最基本的形式我可以用它来重现它.最后,我有以下代码的这两个文件
c.hh:
#ifndef C_HH_
#define C_HH_
class complex {
public:
double re;
};
#endif
Run Code Online (Sandbox Code Playgroud)
test.cc:
#include <iostream>
#include "c.hh"
int main(int argc, char **argv) {
complex* c;
c->re = 0.0;
for (int i = 0; i < 3; ++i) {
c->re = (c->re) + (i==1)?0:1;
}
std::cout << c->re;
}
Run Code Online (Sandbox Code Playgroud)
我可以拿出的唯一一行仍然会出现错误,即c.re的初始化,即"c-> re = 0.0;".但是,我留下了这个,因为即使我删除代码的下半部分,如果没有这行,错误仍然会发生,因为c.re尚未初始化(或者我认为?).
我发现其他一切都是重现错误的必要条件,即
1)for循环.如果i = 1,2,3的行是单独写的,则不会导致错误.
2)我的极限!例如,如果我只从0到2运行,则不会导致错误.仅在至少3次迭代后才会发生.
3)显式赋值"c-> re =(c-> re)+",使用"+ ="而不是"=(c-> re)+"不会导致错误.
4)i"(i == 1)?0:1"的评估和(!)条件检查.使用if(..)执行此操作也会导致错误,但如果不使用i,则不会导致错误,或者不执行条件检查.
5)c.re的输出.即"std :: cout << c-> re;".简单地评估c.re("c-> re;")不会导致错误.如果只有输出而没有评估c.re,它也不会导致错误.通过"fprintf(stdout,"%d",c - > - re)执行相同操作;" …
stack-dump ×6
c++ ×2
c ×1
cygwin ×1
debugging ×1
java ×1
optimization ×1
stack-trace ×1
ubuntu ×1