标签: callstack

如何释放C中的调用堆栈?

我创建了一个使用 RDP(递归下降解析器)的计算器来解析和评估数学表达式“例如:5 cos(30) -5 (3+5)”。问题是我还尝试包含像“config”这样的命令,它可以让用户配置角度单位(Gra、Rad、Deg)。而这里我发现了代码设计的问题。

调用堆栈的简化示例:

int main()
{
   parseexpr()
    {
       parseterm()
       {
          parsefactor()
          {
              parsecommand() or parsefct() or parsenumber();
          }

       }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在当用户输入“config”命令时。我想让他配置计算器(配置位于 .txt 文件内),然后跳回“main()”(他会被要求再次输入表达式),因为通过调用返回会出现问题堆栈,因为我需要一个返回值,而“parsecommand()”无法返回。

我的问题是如何清理调用堆栈,以便我可以通过“goto”语句直接返回到 main ?

c stack callstack goto setjmp

1
推荐指数
1
解决办法
148
查看次数

有人可以在iPhone应用程序中帮我介绍一下这个堆栈跟踪吗?

Program received signal:  “EXC_BAD_ACCESS”.
(gdb) bt
#0  0x30011940 in objc_msgSend ()
#1  0x30235f24 in CFRelease ()
#2  0x308f497c in -[UIImage dealloc] ()
#3  0x30236b78 in -[NSObject release] ()
#4  0x30a002a0 in FlushNamedImage ()
#5  0x30250a26 in CFDictionaryApplyFunction ()
#6  0x30a001a4 in _UISharedImageFlushAll ()
#7  0x30a00738 in +[UIImage(UIImageInternal) _flushCacheOnMemoryWarning:] ()
#8  0x3054dc80 in _nsnote_callback ()
#9  0x3024ea58 in _CFXNotificationPostNotification ()
#10 0x3054b85a in -[NSNotificationCenter postNotificationName:object:userInfo:] ()
#11 0x3054dbc0 in -[NSNotificationCenter postNotificationName:object:] ()
#12 0x30a00710 in -[UIApplication _performMemoryWarning] ()
#13 0x30a006a8 in …
Run Code Online (Sandbox Code Playgroud)

iphone callstack exc-bad-access stack-trace

0
推荐指数
1
解决办法
1671
查看次数

无效的指针操作+调用堆栈

当我收到"无效的指针操作"时,它是我的调用堆栈窗口错误:

CalStack http://m8spy.com//PersonalFs/M8SPY_Images/CallStack_1.png

这个错误的原因是什么?

谢谢

delphi free callstack

0
推荐指数
1
解决办法
367
查看次数

为什么这个调用堆栈如此奇怪?

今天我正在调试我的Android应用程序,它崩溃了.这是调用堆栈:

android.content.res.Resources$NotFoundException: String resource ID #0x8822
        at android.content.res.Resources.getText(Resources.java:246)
        at android.widget.TextView.setText(TextView.java:3860)
        at com.whackanandroid.GameActivity.gameOver(GameActivity.java:68)
        at com.whackanandroid.Game$1.onCountDownFinished(Game.java:79)
        at com.whackanandroid.CountDown$1.run(CountDown.java:23)
        at android.os.Handler.handleCallback(Handler.java:730)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:213)
        at android.app.ActivityThread.main(ActivityThread.java:5225)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:525)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:741)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
        at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)

然后我点击了行号链接(TextView.java:3860),它带我去了一行javadoc评论.我真的很困惑.评论永远不会被执行.这不可能是错的.这很奇怪.

这是我的代码:

public void gameOver () {
    tvScore.setText (Integer.toString (Game.getInstance ().getScore ()));
    tvHighscore.setText (Game.getInstance ().getHighscore ());
    tvScoreText.setVisibility (View.VISIBLE);
    tvScore.setVisibility (View.VISIBLE);

    Animation anim = AnimationUtils.loadAnimation (this, R.anim.cover_fade_in);
    anim.setAnimationListener (new Animation.AnimationListener () {
        @Override
        public void onAnimationStart(Animation animation) {
            GameActivity.this.cover.setVisibility (View.VISIBLE);
        }

        @Override
        public …
Run Code Online (Sandbox Code Playgroud)

java android callstack

0
推荐指数
1
解决办法
67
查看次数

What is the actual size of stack red zone?

In the x86-64 System V ABI it is specified that the space behind the $rsp - 128 is the so-called red zone which is not touched by any signal handlers. On my machine

$ ulimit -s
8192
Run Code Online (Sandbox Code Playgroud)

I expected there is only 2 pages in the stack. So I wrote the following program to test till which size red zone can expand:

PAGE_SIZE equ 0x1000
SYS_exit equ 0x3C

section .text
global _start 

_start:
    lea rcx, [rsp - 0x1f * PAGE_SIZE] …
Run Code Online (Sandbox Code Playgroud)

assembly callstack mmap x86-64 red-zone

0
推荐指数
1
解决办法
125
查看次数

如果涉及 MAP_FIXED,无限堆栈不能超过最初的 132KiB?

我正在使用堆栈进行一些实验,以下内容让我陷入困境。

可以看出Linux在大小上有初始[stack]映射132KiBulimit -s unlimited如果我们进行相应的调整,我们可以进一步扩展堆栈rsp。所以我设置ulimit -s unlimited并运行了以下程序:

PAGE_SIZE     equ 0x1000

;mmap staff
PROT_READ     equ 0x01
PROT_WRITE    equ 0x02
MAP_ANONYMOUS equ 0x20
MAP_PRIVATE   equ 0x02
MAP_FIXED     equ 0x10

;syscall numbers
SYS_mmap      equ 0x09
SYS_exit      equ 0x3c

section .text

global _start

_start:
    ; page alignment
    and rsp, -0x1000

    ; call mmap 0x101 pages below the rsp with fixed mapping
    mov rax, SYS_mmap
    lea rdi, [rsp - 0x101 * PAGE_SIZE]
    mov rsi, PAGE_SIZE
    mov …
Run Code Online (Sandbox Code Playgroud)

linux assembly callstack mmap x86-64

0
推荐指数
1
解决办法
69
查看次数

如何测量 C 中任意函数调用使用的堆栈量?

我们公司买了一个专有的 C 函数:我们有一个编译库ProcessData.a和一个接口文件来调用它:

# ProcessData.h
void ProcessData(char* pointer_to_data, int data_len);
Run Code Online (Sandbox Code Playgroud)

我们想在ARM嵌入式 CPU上使用这个函数,我们想知道它可能使用多少堆栈空间。

问题:如何测量任意函数的堆栈使用情况

到目前为止,我尝试的是实现以下辅助功能:

static int* stackPointerBeforeCall;

void StartStackMeasurement(void) {
    asm ("mov %0, sp" : "=r"(stackPointerBeforeCall));
    // For some reason I can't overwrite values immediately below the
    // stack pointer. I suspect a return address is placed there.
    static int* pointer;
    pointer = stackPointerBeforeCall - 4;
    // Filling all unused stack space with a fixed constant
    while (pointer != &_sstack) {
        *pointer = 0xEEEEEEEE;
        pointer--; …
Run Code Online (Sandbox Code Playgroud)

c assembly callstack arm stack-size

0
推荐指数
1
解决办法
81
查看次数

OpenEdge Progress-4GL 开发:如何从错误消息中了解我正在运行的程序?

正如之前的问题所述,我对 Progress-4GL 开发还很陌生。

我刚刚创建了一个 windows(*.w file)以及一个(*.p file)基于包含文件的过程文件(*.i file)

我做错了什么,我收到一条错误消息,复制粘贴显示以下内容:

---------------------------
Fout
---------------------------
** Begin positie voor SUBSTRING, OVERLAY, enz. moet 1 of groter zijn. (82)
---------------------------
OK   
---------------------------
Run Code Online (Sandbox Code Playgroud)

如您所见,这是错误 82 的荷兰语翻译:

** Starting position for SUBSTRING, OVERLAY, etc. must be 1 or greater. (82)

The SUBSTRING, OVERLAY, etc, functions require that the start position (second argument) be greater than or equal to 1. 
P
Run Code Online (Sandbox Code Playgroud)

我想知道哪个过程/函数正在启动此错误消息。我正在使用 AppBuilder 版本 11.6 和相应的过程编辑器,因此调试的可能性非常有限。我在想的一件事是转储 Windows 进程,以确定调用堆栈,但我不确定如何执行此操作。我还尝试使用Process Explorer并检查“procwin32.exe”进程内线程的各个堆栈的堆栈,但我不确定如何继续。 …

debugging callstack progress-4gl openedge

0
推荐指数
1
解决办法
362
查看次数

为什么 __builtin_return_address 在 Clang 中崩溃?

我有以下 C/C++ 代码,它使用__builtin_return_address

#include <stdio.h>

#ifdef __clang__
# define optnone __attribute__((optnone))
#else
# define optnone __attribute__((optimize("O0")))
#endif

void *f() {
    return __builtin_extract_return_addr(__builtin_return_address(2));
}

optnone void nest1() {
    printf("%p\n", f());
}

optnone void nest2() {
    nest1();
}

optnone void nest3() {
    nest2();
}

optnone void nest4() {
    nest3();
}

optnone int main() {
    nest4();
}
Run Code Online (Sandbox Code Playgroud)

GCC生成以下程序集并且工作正常(不会崩溃):

f:
        push    rbp
        mov     rbp, rsp
        mov     rax, QWORD PTR [rbp+0]
        pop     rbp
        mov     rax, QWORD PTR [rax]
        mov     rax, QWORD …
Run Code Online (Sandbox Code Playgroud)

c assembly callstack clang backtrace

0
推荐指数
1
解决办法
328
查看次数

函数序言中的“mov rbp, rsp”

push   rbp
mov    rbp, rsp
mov    DWORD PTR [rbp-0x4],edi
Run Code Online (Sandbox Code Playgroud)

在汇编函数序言中,不是push rbp已经将其值移到了rsp?为什么mov rbp, rsp指令再次移动相同的rsprbp?是必要的还是多余的?

x86 assembly callstack stack-frame

0
推荐指数
1
解决办法
3567
查看次数