为了澄清,我的问题是当调用者和被调用者在与GCC编译器和链接器的同一编译单元中定义时,包装/拦截从一个函数/符号到另一个函数/符号的调用.
我的情况类似于以下情况:
/* foo.c */
void foo(void)
{
/* ... some stuff */
bar();
}
void bar(void)
{
/* ... some other stuff */
}
Run Code Online (Sandbox Code Playgroud)
我想包装对这些函数的调用,我可以用ld的--wrap选项(到某一点)用ld的选项(然后我实现__wrap_foo和__wrap_bar,然后按照ld --wrap选项的结果调用__real_foo和__real_bar ).
gcc -Wl,--wrap=foo -Wl,--wrap=bar ...
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,这只对来自此编译单元外部的foo和bar的引用生效(并在链接时解析).也就是说,从foo.c中的其他函数调用foo和bar 不会被包装.

我尝试使用objcopy --redefine-sym,但只重命名符号及其引用.
我想将调用替换为foo和bar(在foo.o中)__wrap_foo以及__wrap_bar(就像它们通过链接器--wrap选项在其他目标文件中解析一样)之前我将*.o文件传递给链接器的--wrap选项,而不必修改foo .c的源代码.
这样,包装/拦截发生在所有调用foo和bar,而不仅仅是发生在foo.o之外的调用.
这可能吗?
可能这在JUnit文档中可能是显而易见的,但似乎无法找到它,也不记得是否有我要描述的解决方案.
当我通过maven(mvn test)运行我的测试用例时,标准错误中根本不会显示意外异常的堆栈跟踪.我得到的只是一条消息,表明测试失败了.
如果我的测试代码抛出一个未经检查的异常,比如一个NPE,我的测试用例输出如下所示:
Tests in error:
testFoo(bar.Foo)
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0
Run Code Online (Sandbox Code Playgroud)
如果我的测试用例声明它可以抛出一个Exception对象,我就像这样包装运行时异常:
@Test
public void testFoo() throws Exception
{
try{ // something funky
throw new NullPointerException();
} catch( RuntimeException ex ) {
throw new Exception(ex);
}
}
Run Code Online (Sandbox Code Playgroud)
然后我们得到这个:
Tests in error:
testFoo(bar.Foo): java.lang.NullPointerException
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0
Run Code Online (Sandbox Code Playgroud)
现在我得到的东西几乎没用.但是,我想看到完整的辣酱玉米饼馅,整个堆栈的痕迹.但是我似乎没有找到一种方法来使用JUnit,除了在catch/try块中克服我的测试用例以将堆栈跟踪打印到标准错误(丑陋):
@Test
public void testFoo() throws Exception
{
try{ // something funky
throw new NullPointerException();
} catch( RuntimeException …Run Code Online (Sandbox Code Playgroud) 这是一个JMock + JUnit特定的问题(这是我必须使用的两种技术).是的,我想要做的就是使用PowerMock,但这是一个边缘情况,不保证更换工具.不,对不起,我不是要问这个问题来辩论静态方法的哲学有效性:)
有了这个,我真的要感谢任何人看看这个问题.
我有一些遗留代码,我需要编写一个测试(我们试图围绕继承的代码进行测试,以确保我们在潜在的大规模重构工作中不会破坏任何东西......这是另一个时间的故事.)
我试图模拟的Foo.bar方法是使用JMock的类imposterizer工具(通过JUnit4Mockery)在下面的类中的方法.
下面的代码代表我正在测试包装的代码:
public class Foo {
public abstract <T> void bar(
Class<? extends T> paramClass, T paramT);
Run Code Online (Sandbox Code Playgroud)
我的测试设置旨在允许任何#调用bar()接收一个Class实例(显然退化为Class ...愚蠢的Java类型擦除"功能"),与任何Snafu实例配对.
这是这里的关键区别.我没有配对两个Matcher参数,或两个文字参数,但是一个文字(T.class)和任何类型T的值.JMock不允许这样,所以预期的解决方案是有一个Matcher>和一个Matcher:
Foo mock = context.mock(Foo.class);
context.checking(new Expectations() {
// keep warnings close to the culprit code when possible
@SuppressWarnings("unchecked")
public void allow(final Foo mockedFoo) {
allowing(mockedFoo).bar(
with(any(Snafu.class.getClass())), // Matcher that *should* resolve to Class<?>
with(any(Snafu.class))); // matcher to anything …Run Code Online (Sandbox Code Playgroud) 我一直在努力学习嵌入式软件开发已有一段时间了(已经做了近15年的软件,10年用Java编写,还有大学的C/C++/X86 Asm知识.)开始玩基于PIC的评估板踢.
在我工作的地方,有一个部门.他们不时在嵌入式系统上有一些空缺.他们寻求的一件事就是使用PowerPC架构.
我已经查看了使用PowerPC芯片的廉价评估板的interweebz,但我发现所有的板都在400美元到1000美元之间.我想知道是否有一种廉价的方法可以在PowerPC架构上学习嵌入式系统,因为我已经看到其他架构的评估板价格在这个价格范围的一小部分.
或者,如果是一个评估.无法以合理的价格提供电路板,至少是在PowerPC汇编中练习编程的廉价平台(即使它没有嵌入).
有人可以提出一些建议吗?
哦,如果你能推荐一些关于PowerPC架构和编程的书籍,那也很棒.
我最近安装了Papyrus并尝试按照教程创建模型并从中生成Java代码.
不幸的是,我在开始时几乎陷入困境.在类定义中,我添加了一个静态操作main,并且我可以将其参数指定为数组:
in args: <Undefined> [*]
Run Code Online (Sandbox Code Playgroud)
不幸的是,它不允许我将类型指定为String.也就是说,我想指定如下:
in args: String [*]
Run Code Online (Sandbox Code Playgroud)
无论我如何输入类型(或任何类型),类型都会返回<Undefined>.我怀疑它应该使用的配置文件有些错误或缺失.不幸的是,这个工具的文档相当稀疏,我无法找到答案或解决方案.
任何人都遇到了同样的问题???
我有一个问题,我目前无法有效解决,因为我还不熟悉Metro应用程序开发.所以请忍受我:)
长话短说,我有一个大型,复杂的VS2012 Metro应用程序托管+本机解决方案(目前在Windows 8上构建)到面向Windows 8.1的VS2013中.
我将解决方案导入VS2013(在Windows 8.1上托管),并为其运行转换以及其中的所有子项目.Stuff编译,但是我们遇到问题就是链接器.这是我们得到的链接器错误的一个例子:
error LNK2019: unresolved external symbol __imp___beginthreadex referenced in function <blahblahblah>
error LNK2019: unresolved external symbol __imp___mbsrchr referenced in function <blahblahblah>
error LNK2019: unresolved external symbol _getenv referenced in function <blahblahblah>
error LNK2019: unresolved external symbol __imp___beginthreadex referenced in function <blahblahblah>
error LNK2019: unresolved external symbol __imp___endthreadex referenced in function <blahblahblah>
error LNK2019: unresolved external symbol __imp___mbsrchr referenced in function <blahblahblah>
error LNK2019: unresolved external symbol __imp___mbsnbicmp referenced in function <blahblahblah>
error LNK2019: unresolved …Run Code Online (Sandbox Code Playgroud) linker-errors microsoft-metro visual-studio-2013 windows-8.1
随着RIA和SPA(或使用大量javascript的网络应用程序)变得越来越流行,我一直在运行系统,而不是使用好的旧a href超链接,我看到他们利用使用onclickJavaScript代码操纵导航的构造.对于图像尤其如此.
例如,而不是看到这样的事情:
<a href="some_url"><img src="...."/></a>
<div ... onclick='SomeJsFunctionThatNavsToAnotherPage()'><img src="..."/></a>
Run Code Online (Sandbox Code Playgroud)
这有什么好处?这使得在调试或尝试root导致错误时跟踪页面转换的位置非常困难.我可以了解导航目标何时可以改变(所以是的,在这里你可以使用一个函数来计算要导航到的页面.)
但即使导航到的页面不变,我也会看到这种模式.我发现这非常复杂,难以测试.更不用说总是存在特定于浏览器的错误来自于东西(遗憾的是,根据我对前端过度复杂化的经验).
但我不是RIA/SPA开发人员(只是后端和传统的Web开发).我错过了这背后的理由吗?
我的问题不适用于我们想要重绘页面或更改当前内容而不更改当前位置的情况.我的问题是从A页到B页的普通旧过渡.
在这种情况下,为什么还要用onclick=funcToChangeLocation()了<a href="some location"/>.
在对已编写的系统进行故障排除时,这对我来说是一件痛苦的事情(因为我不会这样写它们),但可能有我不知道的原因.
同样,我的问题不是在不改变浏览器位置的情况下重绘自己的页面,而是从一个页面导航到下一个页面.
如果你打算投票结束这个问题,至少留言解释原因.
我有以下情况:我继承了一个遗留系统,构建为多模块 Maven 项目。
parent
module1
module 1.1 -> generates artifact 1.1
module 2.2 -> generates artifact 1.2
module2
module 2.1
module 2.1.1 -> generates artifact 2.1.1
module 2.1.2 -> generates artifact 2.1.2
module 2.2 -> generates artifact 2.2
module3 -> generates artifact3
Run Code Online (Sandbox Code Playgroud)
这就是现状,而且由于种种原因,无法改变。
此外,这些工件(它们的子集或全部)被其他项目作为依赖项消耗。这些项目是由其他团队使用我无法控制的流程构建的,让每个人都使用正确的版本变得很麻烦。
我希望能够生成一个 BOM,将每个生成的工件列为依赖项管理部分中的依赖项,并具有正确的版本,然后发布该 BOM 供其他人使用。
有点像Spring 框架发布的master/parent bom 。
然后,瞧!我可以尝试手动创建 BOM,但我不想这样做。
我继承的遗留项目并不是唯一面临这些挑战的项目。如果我能找到一种自动化的方法来做到这一点,那对我和我的同事来说将是一个巨大的胜利。
我没有找到任何关于如何生成此类 bom 的参考资料。
我只看到有关如何使用一个依赖项或如何为项目依赖项手动创建一个依赖项的文档。
我没有看到任何有关如何生成列出/导出项目创建的工件(供其他人使用)的文档。
谢谢。
附言。这个项目并不是唯一的一个。还有其他项目正在构建和消耗,就像在噩梦般的 11 维量子纠缠的超级意大利面条球的依赖厄运中(眨眼,眨眼。)
我正在使用lcov为C代码库生成代码覆盖率报告.我想将测试描述集成到最终输出中(使用lcov的gendesc实用程序.)
但是,我不清楚如何做到这一点,并且关于gendesc的文档看起来相当稀疏(就好的旧谷歌能够告诉我的那样.)
LTP的gendesc信息描述了如何创建输入测试用例描述文件(如genhtml所预期的那样).而GENHTML信息提供--show-descriptions,以及--description-file用于输入这样的测试案例描述文件.
但是,我不知道如何引用测试用例以便将它们包含在最终报告中.genhtml将它们视为未使用的测试用例,从而使它们不受生成的html输出的影响.我可以使用--keep-descriptions,但这并没有告诉我运行了什么测试用例(显然是因为我不知道如何从代码中引用测试描述.)
那么,我们如何告诉lcov/genhtml哪些测试在最终输出中运行?有任何想法吗?
在工作中,我们使用多种工具来捕获多个指标(主要是圈复杂度和 LCOM)。我们使用这些来获取警告标志并指导先发制人的重构工作。它对提高代码质量非常有益。
但是,该过程与构建过程无关。它是分开进行的。此外,我正在寻找可以使源代码固有的东西(而不是在其上运行的外部进程。)
有没有人知道一组可以从编译器运行的注释和可配置的注释处理器,如果代码不符合阈值圈/LCOM 指标,这将使构建失败?
我想我可以从 maven/ant 运行 ckjm、checkstyle 和 pmd,但是一些工作在源代码上,其他工作在字节码上。在编译开始之前有一个可以处理源代码的整合工具会很好。
另一件事是,如果有一组注释可以推动这一点,那就太好了(允许在极端情况下不可避免地需要定制。)
@LCOM3(Threshold=1.5)
public class SomeDumbPojo {... buch of gets/sets...}
// by default would be measured against a strict LCOM3
public class ActualBizClass
{
@CYCLOMATIC_COMPLEXITY(Threshold=15)
public void someFatIrreducibleMethod(){...}
}
Run Code Online (Sandbox Code Playgroud)
然后,当我们运行该工具时,默认情况下会应用严格的(和可配置的)指标阈值,除了那些用(希望有记录且合法的)更宽松的阈值进行注释的工件。对于一些不能/不应该减少的方法,放宽的圈复杂度是有意义的。对于没有行为的普通 POJO,LCOM 需要放松……等等等等。
尽我所能寻找和谷歌搜索,我找不到任何东西(希望是开源的)。但我不妨在这里问一下,以防万一有人知道这类事情。
谢谢。
SPOILER ALERT:如果你试图自己解决Project Euler的问题#2,不要看这个问题.
我已经完成了Euler项目的问题#2(计算所有偶数Fibonacci(n)数小于或等于400万的总和) - 我正在使用这些问题练习我的C/Ada技能,重新审视我的Common Lisp和学习Haskell.
当我试图在Haskell中重新实现我的解决方案时,我遇到了一个问题.在古典时尚中,它正在计算错误的答案.但是,我认为我的Haskell实现类似于我的Common Lisp实现(它确实产生了正确的结果.)
该算法仅计算n的斐波那契数n % 3 == 0.这是因为
这是Haskell实现:
uber_bound = 40000000 -- Upper bound (exclusive) for fibonacci values
expected = 4613732 -- the correct answer
-- The implementation amenable for tail-recursion optimization
fibonacci :: Int -> Int
fibonacci n = __fibs (abs n) 0 1
where
-- The auxiliary, tail-recursive fibs function
__fibs :: Int -> Int -> Int -> Int …Run Code Online (Sandbox Code Playgroud) 给出以下xml:
<inventory>
<item name="..." sku="123"/>
<item name="..." sku="not available"/>
<catalog vendor="...">
<product id="--not available--"/>
<product id="345"/>
</catalog
</inventory>
Run Code Online (Sandbox Code Playgroud)
我想替换其中"不可用"的任何属性值(任何地方)'000'.
我在XSLT中尝试了不同的组合(这不是我的强项),当我为每个属性添加特定的XPath表达式时,我能够替换它们.不幸的是,我可能正在处理的XML文档(形成良好的思想)可能具有不同的结构和属性命名约定.
所有重要的是扫描特定属性值(或值模式)并将其替换为特定于问题的默认值.我发现自己只是在Python中破解了一个解决方案(加载文档,迭代DOM并修改符合条件的任何节点中的任何属性.)
但我真的想在XSLT中学习这个解决方案(无论是替换匹配模式的属性值,还是直接字符串比较),如果存在的话.如果你愿意,可以有专业的好奇心.
任何帮助,将不胜感激.关于解释这些XLST/XPath复杂性的源或书的任何建议都会很棒(我只发现了非常简单的例子,没有任何像这样的任意.)
我有一个遗留项目的情况,如果使用 1.8 或 1.9 以外的 JDK 运行时调用 Maven,我需要一个项目失败。原因是当前项目的依赖项曾经是 JDK 的一部分,但从 JDK 11 开始不再存在。
这与为 maven-plugin 编译器(当前设置为 8)指定源和目标版本不同。
构建已经失败,抱怨无法解析的依赖关系,但我希望它失败并显示一条消息,说“您需要使用 JDK 8/9 运行时”(清晰度始终为王。)
这只是一个权宜之计,以避免人们发送关于未编译的恐慌电子邮件,因为他们使用了 JDK 11+,并且我不能依赖每个人在他们的 toolchains.xml 中设置自己的 JDK。
java ×4
maven ×3
mocking ×2
unit-testing ×2
annotations ×1
assembly ×1
embedded ×1
gcc ×1
haskell ×1
html5 ×1
interceptor ×1
javascript ×1
jmock ×1
junit ×1
junit4 ×1
lcov ×1
ld ×1
linker ×1
metrics ×1
modeling ×1
papyrus ×1
powerpc ×1
recursion ×1
spring ×1
testcase ×1
uml ×1
windows-8.1 ×1
xml ×1
xpath ×1
xslt ×1