Tencent / flare

Flare是广泛投产于腾讯广告后台的现代化C++开发框架,包含了基础库、RPC、各种客户端等。主要特点为易用性强、长尾延迟低。
Other
1.33k stars 200 forks source link

问一个非常诡异的用例 #140

Closed yinghaoyu closed 11 months ago

yinghaoyu commented 11 months ago
  1. https://github.com/Tencent/flare/tree/master/flare/base/compression/compression_test.cc 运行./compression_test gzip

    std::string Compress(
      std::function<bool(Compressor*, CompressionOutputStream* out)> f) {
    if (!with_test_output_stream_) {
      NoncontiguousBufferBuilder builder;
      NoncontiguousBufferCompressionOutputStream out(&builder);
      auto&& c = MakeCompressor(method_);  //  调试这里一直返回nullptr
      EXPECT_TRUE(c);
  2. https://github.com/Tencent/flare/blob/master/flare/base/compression_test.cc 这个用例正常运行。

gzip都已经在cpp文件FLARE_COMPRESSION_REGISTER_COMPRESSOR("gzip", GzipCompressor);注册过了,这是啥情况?

0x804d8000 commented 11 months ago

没太理解,是说编译以后直接运行compression_test gzip失败了吗,但是这个compression_test感觉接受不了参数啊🤔

yinghaoyu commented 11 months ago

第1个用例SetUp()函数会读取参数的。第2个用例是正常的,作为参照。

0x804d8000 commented 11 months ago

我还是没理解是怎么从命令行读到的gzip,要么cout一下看看是不是真的读到了?

yinghaoyu commented 11 months ago

./compression_test gzip这里的gzip是输入参数,看这个用例代码应该是需要入参的

  std::string Compress(
      std::function<bool(Compressor*, CompressionOutputStream* out)> f) {
    if (!with_test_output_stream_) {
      NoncontiguousBufferBuilder builder;
      NoncontiguousBufferCompressionOutputStream out(&builder);
     // Setup()函数解析后,这里method_为入参值gzip
      auto&& c = MakeCompressor(method_);  //  调试这里一直返回nullptr
      EXPECT_TRUE(c);

这是第一个用例的问题。 第二个用例是直接代码里写的MakeCompressor(“gzip”),能正常得到Compressor。 两个用例同样是MakeCompressor(“gzip”),结果第一个用例在EXPECT_TRUE(c);失败了。

0x804d8000 commented 11 months ago

你的执行方式是

~/flare/build64_release/flare/base/compression_test.runfiles]% LD_LIBRARY_PATH=. ../compression_test gzip

这样吗

我这样执行看起来命令行参数gzip被忽略了,跟直接执行LD_LIBRARY_PATH=. ../compression_test效果是一样的

你也可以试试把method_打出来看看是不是符合预期的内容

yinghaoyu commented 11 months ago

你看的是第二个用例,这个是对的。我说的是第一个用例,method_打印是符合我预期的。

0x804d8000 commented 11 months ago

你运行的是master代码生成的flare/base/compression/compression_test吗?

我试了下不管不传命令行参数或者传命令行参数gzip,输出是一样的。而且根据我的理解,gtest也不会因为命令行传入了一个不以-开头的参数就改变行为。

yinghaoyu commented 11 months ago

确实是master分支代码,不过我自己用cmake管理的。那就奇怪了,感觉像是auto&& c = MakeCompressor(method_);早于全局变量FLARE_COMPRESSION_REGISTER_COMPRESSOR("gzip", GzipCompressor);的初始化,只有这种情况才会出错,但是用例2却正常运行。。。

0x804d8000 commented 11 months ago

用cmake的话注意一下https://github.com/Tencent/flare/blob/master/flare/base/compression/BUILD#L55 link_all_symbols,对应于-Wl,--whole-archive

不然链接器可能会把自动注册的这些文件丢掉

https://stackoverflow.com/questions/805555/ld-linker-question-the-whole-archive-option

yinghaoyu commented 11 months ago

谢谢,原来如此。