- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在为 32 位 Atom 硬件集成 gRPC。 gRPC 在 64 位 Ubuntu PC 计算机上交叉编译。交叉编译使用 Yocto。 gRPC 的 CMakeLists.txt 文件通过 add_subdirectory() 函数包含到主项目中,并以静态方式链接。为了测试gRPC,我使用了谷歌的C++语音示例代码。
完整的项目正确构建并毫无问题地部署在目标硬件上。当我运行示例程序时,执行陷入文件 trace.cc 的方法 TraceFlagList::Set(const char* name, bool enabled) 的无限循环中。
为了检查问题,我在这个方法中的每个循环中都放了一些 printf():
bool TraceFlagList::Set(const char* name, bool enabled) {
TraceFlag* t;
if (0 == strcmp(name, "all")) {
for (t = root_tracer_; t; t = t->next_tracer_) {
printf("%s 1 %s\n", __func__, t->name_);
t->set_enabled(enabled);
}
} else if (0 == strcmp(name, "list_tracers")) {
LogAllTracers();
} else if (0 == strcmp(name, "refcount")) {
for (t = root_tracer_; t; t = t->next_tracer_) {
printf("%s 2 %s\n", __func__, t->name_);
if (strstr(t->name_, "refcount") != nullptr) {
t->set_enabled(enabled);
}
}
} else {
bool found = false;
for (t = root_tracer_; t; t = t->next_tracer_) {
printf("%s 3 %s\n", __func__, t->name_);
if (0 == strcmp(name, t->name_)) {
t->set_enabled(enabled);
found = true;
}
}
// check for unknowns, but ignore "", to allow to GRPC_TRACE=
if (!found && 0 != strcmp(name, "")) {
gpr_log(GPR_ERROR, "Unknown trace var: '%s'", name);
return false; /* early return */
}
}
return true;
}
在 TraceFlagList 对象中似乎多次添加了一些 TraceFlag 指针。这是添加方法:
void TraceFlagList::Add(TraceFlag* flag) {
flag->next_tracer_ = root_tracer_;
root_tracer_ = flag;
}
要添加的第一个元素的 next_tracer_ 成员指向 null。但是在多次添加之后,TraceFlagList::Add() 会再次使用相同的 TraceFlag 指针调用。第一个将其 next_tracer_ 成员指向列表的最后一个元素,使列表循环到自身。
运行可执行文件会在命令行中显示这些行:
...
Set 3 api
Set 3 timer_check
Set 3 timer
Set 3 resource_quota
Set 3 executor
Set 3 bdp_estimator
Set 3 client_idle_filter
Set 3 cares_resolver
Set 3 cares_address_sorting
Set 3 round_robin
Set 3 pick_first
Set 3 xds
Set 3 glb
Set 3 inproc
Set 3 health_check_client
Set 3 secure_endpoint
Set 3 http2_stream_state
Set 3 flowctl
Set 3 http
Set 3 connectivity_state
Set 3 tcp
Set 3 http1
Set 3 handshaker
Set 3 channel
Set 3 subchannel_pool
Set 3 subchannel
Set 3 client_channel_routing
Set 3 client_channel_call
Set 3 tsi
Set 3 plugin_credentials
Set 3 server_channel
Set 3 queue_pluck
Set 3 op_failure
Set 3 compression
Set 3 call_error
Set 3 api
Set 3 timer_check
Set 3 timer
Set 3 resource_quota
Set 3 executor
Set 3 bdp_estimator
Set 3 client_idle_filter
Set 3 cares_resolver
Set 3 cares_address_sorting
^C
我必须使用 ctrl+c 中断可执行文件才能停止它。我通过首先检查要添加到列表中的元素是否存在来解决此问题:
void TraceFlagList::Add(TraceFlag* flag) {
// Check TraceFlag existence in the list before adding it.
for (const TraceFlag* t = root_tracer_; t != nullptr; t = t->next_tracer_) {
if (t == flag) {
gpr_log(GPR_DEBUG, "\t%s", t->name_);
printf("TraceFlag %s already in TraceFlagList. Ignore.\n", t->name_);
return;
}
}
flag->next_tracer_ = root_tracer_;
root_tracer_ = flag;
}
但这是一种解决方法:在为 Ubuntu 主机构建和运行原始代码时,不存在无限循环的问题。每个 TraceFlag 指针仅添加一次。而且我真的不知道 TraceFlag 在 gRPC 中的用途。
恐怕解决方法可能会隐藏真正的问题,这可能会产生意想不到的副作用。有人知道这个问题的根源吗?或者我应该在 gRPC 项目中提出这个变通办法吗?
问候。
最佳答案
这看起来像 https://github.com/grpc/grpc/issues/20690grpc 核心使用一些全局变量,如果您以某种方式链接了多个版本的 grpc 库,则全局变量会损坏。
关于c++ - gRPC trace.cc 的方法 TraceFlagList::Add(TraceFlag* flag) 使其链表循环到自身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57891055/
我在 X、Y 中有一个连续的点集合,我想将它们“追踪”到一组贝塞尔曲线中。是否可以为此使用任何开源位图到矢量跟踪算法或库? 最佳答案 这取决于你想要完成什么。如果您想查看“最佳拟合”曲线,或者至少是粗
这是我的程序: #include int sc_main(int argc, char* argv[]) { sc_signal a, b, c, d; // trace file
我想跟踪状态单子(monad)的变化。这不起作用: main :: IO () main = do print $ snd $ execState compute initialState t
Trace.Write 之间有什么区别? Writes information about the trace to the trace listeners 和Trace.TraceInformati
在 Chrome 中,您可以通过在运行时设置标志(使用 --js-flags="--stack-trace-limit " )或通过控制台(使用 Error.stackTraceLimit )来增加堆
我有一个第三方 Windows 服务,它控制/监视设备并更新 Oracle 数据库。他们的服务偶尔会报告关于数据库中的行/列“坏”的错误,但不会给出底层数据库错误,他们的服务需要重新启动,一切正常。当
我看到了这个关于 Tracing paint operations in Chrome Canary 的短视频 我已经尝试了所有选项,但无法使用这些出色的功能。 1.油漆(快照): 2.图层 View
在我的一个项目(.net core 3.1)中,我需要一种将 System.Diagnostics.Trace.WriteLine 重定向到 Serilog 文件的方法。我找到了 SerilogTra
我正在编写一个自动分析系统,以在我的应用程序中分析不同的 GPU 密集型屏幕。为此,我一直在尝试使用“XCode Instruments”,使用捕获 gpu 使用数据的“OpenGL ES Drive
我正在学习来自 JustForFunc episode 22 的教程 在 main.go 的 main() 开头添加这两行: trace.Start(os.Stdout) defer trace.St
我正在将 History.js 中的绑定(bind)编写到 PureScript 中,但仍在努力理解 Eff monad、一排效果是什么以及它们为何有值(value)。现在我用 EasyFFI 写了以
我不确定我是否理解 ETW 使用 System.Diagnostics.Tracing 和使用 System.Diagnostics.Trace 之间的主要区别。我知道使用它们我可以将事件转储到一些输
我需要像 native 一样的缩进和非缩进处理 trace class .有什么想法可以用 log4net 文件和控制台 appender 完成吗?谢谢 最佳答案 我建议将 log4net 控制台附加
当使用 Trace.Listener 时,任何人都可以告诉我为什么 Trace.Write(string message, string category) 方法时不将类别字符串传递给 TraceFi
我有一个从 Apache2 提供的 Django Web 应用程序,在 Docker 容器中使用 mod_wsgi,该容器运行在 Google Cloud Platform 的 Kubernetes
我的 LogCat 出现一些错误... E/Trace(627): error opening trace file: No such file or directory (2) 然后我找不到解决方案
我正在关注本教程:https://huggingface.co/transformers/torchscript.html 创建我的自定义 BERT 模型的痕迹,但是在运行完全相同的 dummy_in
我理解当请求包含 Ocp-Apim-Trace: true 时,如下所示: GET /api/v1/BotConfig HTTP/1.1 Host: xyz.azure-api.net Cache-C
我理解当请求包含 Ocp-Apim-Trace: true 时,如下所示: GET /api/v1/BotConfig HTTP/1.1 Host: xyz.azure-api.net Cache-C
My Microservices application has 3 different Microservices. many of them have been created with j
我是一名优秀的程序员,十分优秀!