为什么这个功能有效但给我一个分段错误?

时间:2017-01-29 20:49:37

标签: assembly x86 att

//our root app component
import {Component, NgModule, Input, Output, EventEmitter, HostBinding, HostListener} from '@angular/core'
import {BrowserModule} from '@angular/platform-browser'

@Component({
  selector: 'person',
  //template will NOT be inherited 
  template: `<h4>Person: {{name}}</h4>`
})
export class Person {
  @Input() name; //will be inherited
  //  @Output() onClick = new EventEmitter(); //will be inherited
  //  clicked() { //will be inherited
  //    this.onClick.emit(this.name);
  //  }
  @HostBinding('style.color') color = 'red';  //will be inherited

  @HostListener('click', ['$event']) //will be inherited 
  onClick(e){
    console.log(this.name);
  }
}

@Component({
  selector: 'employee',
  template: `
    <h4>Employee: {{name}}, id: {{id}}</h4>
  `
})
export class Employee extends Person {
  @Input() id; // new

  @HostListener('click', ['$event']) // overridden
  onClick(e) { 
    console.log(`${this.name}-${this.id}`);
  }
}


@Component({
  selector: 'my-app',
  template: `
    <div>
      <person name="John"></person>
      <employee name="Tom" id="45231"></employee>
    </div>
  `,
})
export class App { }

@NgModule({
  imports: [ BrowserModule ],
  declarations: [ App, Person, Employee ],
  bootstrap: [ App ]
})
export class AppModule {}

如果命令行上的参数计数不等于2但是给我一个分段错误,为什么函数argCount会正确执行?该程序的整体控制流程似乎正常工作。也许函数序言或结语有问题吗?

2 个答案:

答案 0 :(得分:0)

直接问题是whereQuery.put("age", new BasicDBObject('$gt', 30)) // ^ ^ here 末尾的ret出错了,因为它没有有效的回复地址。

此外,如果您打算使用libc,则应使用argCount,并且还要小​​心按照ABI维护所需的堆栈对齐。使用帧指针是可选的,并且通常对任何事情都没有帮助,所以我省略了它。

这是一个可能的版本:

main

确保使用 .globl main main: # main because we use libc subl $12, %esp # stack alignment movl 16(%esp), %eax # argc cmpl $2, %eax movl $msg3, (%esp) # preset for msg3 jne argCount # if argc!=2 use that movl $msg2, (%esp) # otherwise msg2 movl %eax, 4(%esp) # and argc argCount: call printf # print call exit # exit .data msg2: .asciz "Arg Count = %d\n" msg3: .asciz "This program takes 1 argument -> sizeOfArray\n" 进行编译和链接,以便正确引入libc,如果您在64位环境中生成32位程序,则提供gcc(因为此代码仅适用于32位)。

答案 1 :(得分:0)

这些行错了:

cmp $2, %eax
jne argCount  

CALL做了两件事:

  1. 将返回地址推送到堆栈
  2. 无条件跳转到被叫函数。
  3. 如果使用JccJMP指令调用函数,则需要手动将返回地址压入堆栈,以使代码正常工作。

    push return_address
    jmp argCount
    return_address:
    

    如果您使用条件跳转,这将导致问题,因为当您编写代码时,您无法预测分支是否被采用(因此在被调用时RET函数已经从你的堆栈中弹出了返回地址,或者你需要自己处理它。)

    你应该做的是:

    cmp $2, %eax
    je skip_argcount_call
    call argCount
    skip_argcount_call: