小编Lyc*_*cus的帖子

为什么 AspectJ 生成空的 Annotation 检查?

我正在使用 AspectJ 1.8.8 编译时编织,并且我有一个像这样的块

@SomeAnnotation(value="someValue")
public List doSomething(String someArg) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

where@SomeAnnotation是通过“Around”建议实现的。

使用 JD-GUI 查看字节码,我看到以下生成的代码(略有格式):

public class SomeClass {
  private static Annotation ajc$anno$5;

  ...

  @SomeAnnotation(value="someValue")
  public List doSomething(String someArg)
  {
    String str = someArg;
    JoinPoint localJoinPoint = Factory.makeJP(ajc$tjp_5, this, this, str);
    Object[] arrayOfObject = new Object[3];
    arrayOfObject[0] = this;
    arrayOfObject[1] = str;
    arrayOfObject[2] = localJoinPoint;
    Annotation tmp56_53 = ajc$anno$5;
    if (tmp56_53 == null) {
      tmp56_53;
    }
    return (List)new SomeClass.AjcClosure11(arrayOfObject).linkClosureAndJoinPoint(69648).around(tmp56_53, (SomeAnnotation)(ajc$anno$5 = SomeClass.class.getDeclaredMethod("doSomething", new Class[] { String.class }).getAnnotation(SomeAnnotation.class))); …
Run Code Online (Sandbox Code Playgroud)

java aop aspectj jd-gui jvm-bytecode

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

POLLHUP与POLLNVAL,或什么是POLLHUP?

该联机帮助页用于民意调查(2):

POLLHUP - 挂机(仅限输出)

POLLNVAL - 无效请求:fd未打开(仅输出)

究竟有什么区别?编写一个简单的程序会显示POLLNVAL如果我关闭文件描述符将触发,然后尝试从关闭的fd读取.但是,我无法弄清楚返回的方法POLLHUP.

c unix pipe poll-syscall

4
推荐指数
2
解决办法
1万
查看次数

为什么strace显示ERESTARTSYS用于读取?

我有一个多线程程序,在运行时会strace显示:

read(10, "lorem ipsum...", 100) = 100
read(10, 0x2ae9ebcb5000, 8191) = ? ERESTARTSYS (To be restarted)
--- SIGTERM ... ---
Run Code Online (Sandbox Code Playgroud)

每当发生ERESTARTSYS时,程序最终都会挂起读取.当没有发生ERESTARTSYS时,程序退出成功,我得到:

read(10, "lorem ipsum...", 100) = 100
read(10, "", 8191) = 0
...
exit_group(0)
Run Code Online (Sandbox Code Playgroud)

纵观strace 手册页(对于strace的,是不是我的版本),并像这样的问题这个这个,似乎读出被一些信号中断.我可能误解了文档,但除了SIGTERM之外我没有看到任何信号,我假设是退出该程序.

我已经确定这两个读取来自std :: getline调用,当找不到定界符时它会读取两次(由于分隔符不正确而且字符串中没有任何内容,因此找不到它,但我不能修复它,因为它在一个我无法控制的库中.将分隔符添加到字符串似乎会阻止第二次读取,这会导致代码运行没有问题.

我也很肯定代码中存在一些竞争条件,因为当我关闭并行性时,不会发生此错误.我的一个猜测是,在线程上下文切换期间读取被中断,但这只是一个疯狂的猜测,并且strace中没有任何内容表明这是真的.另外,我不确定为什么它不会在重新切换后简单地重新启动.但是我找不到竞争条件,我希望能理解strace和ERESTARTSYS可以帮我找出bug的位置是.

如果它有帮助,我正在运行RHEL5并使用gcc 4.7.2进行编译.

c linux multithreading operating-system strace

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