我正在使用 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) 该联机帮助页用于民意调查(2):
POLLHUP - 挂机(仅限输出)
POLLNVAL - 无效请求:fd未打开(仅输出)
究竟有什么区别?编写一个简单的程序会显示POLLNVAL如果我关闭文件描述符将触发,然后尝试从关闭的fd读取.但是,我无法弄清楚返回的方法POLLHUP.
我有一个多线程程序,在运行时会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进行编译.