我创建了一个使用 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 ?
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) 当我收到"无效的指针操作"时,它是我的调用堆栈窗口错误:
CalStack http://m8spy.com//PersonalFs/M8SPY_Images/CallStack_1.png
这个错误的原因是什么?
谢谢
今天我正在调试我的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) 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) 我正在使用堆栈进行一些实验,以下内容让我陷入困境。
可以看出Linux在大小上有初始[stack]映射132KiB。ulimit -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) 我们公司买了一个专有的 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) 正如之前的问题所述,我对 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”进程内线程的各个堆栈的堆栈,但我不确定如何继续。 …
我有以下 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) push rbp
mov rbp, rsp
mov DWORD PTR [rbp-0x4],edi
Run Code Online (Sandbox Code Playgroud)
在汇编函数序言中,不是push rbp已经将其值移到了rsp?为什么mov rbp, rsp指令再次移动相同的rsp值rbp?是必要的还是多余的?