我总是在交互式会话中使用 GDB(gdb --args <program>
)
两个问题:
是否可以配置
.gdbinit
自动生成核心转储文件?与第一个问题相关,如果程序崩溃,是否有 GDB 会话命令可以手动生成核心转储文件?
我总是在交互式会话中使用 GDB(gdb --args <program>
)
两个问题:
是否可以配置.gdbinit
自动生成核心转储文件?
与第一个问题相关,如果程序崩溃,是否有 GDB 会话命令可以手动生成核心转储文件?
我正在运行带有 -02 和 g 编译器标志且不使用 gdb 的 ThreadSanitizer。它检测到竞争条件并打印堆栈跟踪,但它继续运行。我很幸运能够进行监控。
有没有办法在检测到问题时强制 ThreadSanitizer 崩溃?
下面的代码使用 Python 列表创建 Plotly 图表。
时间戳是 Epoch 毫秒。如何将 x 轴格式化为可读的日期时间?
我尝试过fig.layout['xaxis_tickformat'] = '%HH-%MM-%SS'
,但没有成功。
import plotly.graph_objects as go
time_series = [1716693661000, 1716693662000, 1716693663000, 1716693664000]
prices = [20, 45, 32, 19]
fig = go.Figure()
fig.add_trace(go.Scatter(x=time_series, y=prices, yaxis='y'))
fig.update_layout(xaxis=dict(rangeslider=dict(visible=True),type="linear"))
fig.layout['xaxis_tickformat'] = '%Y-%m-%d'
fig.show()
我有三个列表,其中包含要通过 Plotly 显示的数据。第一列表示纪元时间戳(以毫秒为单位),第二列和第三列是要绘制的系列。
我正在尝试正确创建 pandas 数据框,以传递给 Plotly。
到目前为止我有这个:
import pandas as pd
epoch=[1716591253000, 1716591254000, 1716591255000, 1716591256000]
series_1=[5,6,7,8]
series_2=[9,10,11,12]
df = pd.DataFrame(data=zip(epoch,series_1,series_2),columns=['Datetime','Series 1','Series 2'])
print(df)
但我不确定如何告诉 pandas 第一列是日期时间列,并且在传递给 Plotly 时需要作为 x 轴。
我找到了这些时间序列的例子:
https://plotly.com/python/time-series/
但不幸的是他们正在加载预先创建的数据
我有三节课。每个类都有自己的标题。
我希望每个类都有两个额外的构造函数来从其余两种类型进行转换:
// A.h
A(const B& b){}
A(const C& c){}
// B.h
B(const A& a){}
B(const C& c){}
// C.h
C(const A& a){}
C(const B& b){}
但是,如果我在每个标头中包含其他两个标头,我最终将得到循环依赖。
实现这一点的最佳方法是什么?
我正在关注原始套接字嗅探器的 C 应用程序示例:
https://www.binarytides.com/packet-sniffer-code-c-linux/
除非我在创建套接字后将套接字绑定到我的接口:
const std::string& iff = "wlp3s0";
int r = setsockopt(sock_raw, SOL_SOCKET, SO_BINDTODEVICE, iff.c_str(), iff.length());
if (r == -1)
{
std::abort();
}
然后我让应用程序运行:
sudo ./the_app
我打开 Wireshark 并监听 wlp3s0 无线接口。我从捕获中删除了有线以太网接口。
然后,我运行sudo dhclient -r
并sudo dhclient
停止/启动 DHCP,Wireshark 检测到 4 或 5 个 DHCP 数据包,如预期的那样:
然而,C 原始套接字嗅探器显示绝对没有收到 UDP 数据包。
如果我随后打开 Web 浏览器,它就会开始显示 TCP 数据包(Wireshark 报告 DHCP 数据包是 UDP)。
发生了什么?我使用的是 Ubuntu 22.04
最小的例子:
#include<stdio.h> //For standard things
#include<stdlib.h> //malloc
#include<string.h> //memset
#include<netinet/ip_icmp.h> //Provides declarations for icmp header
#include<netinet/udp.h> //Provides declarations for udp header
#include<netinet/tcp.h> //Provides declarations for tcp header
#include<netinet/ip.h> //Provides declarations for ip header
#include<sys/socket.h>
#include<arpa/inet.h>
#include <unistd.h>
void ProcessPacket(unsigned char* , int);
int tcp=0,udp=0,icmp=0,others=0,igmp=0,total=0,i,j;
struct sockaddr_in source,dest;
int main()
{
unsigned char *buffer = (unsigned char *)malloc(65536); //Its Big!
printf("Starting...\n");
int sock_raw = socket(AF_INET , SOCK_RAW , IPPROTO_TCP);
if(sock_raw < 0)
{
std::abort();
}
int r = setsockopt(sock_raw, SOL_SOCKET, SO_BINDTODEVICE, "wlp3s0", strlen("wlp3s0"));
if (r == -1)
{
std::abort();
}
while(1)
{
int data_size = recv(sock_raw , buffer , 65536 , 0);
if(data_size <0 )
{
std::abort();
}
ProcessPacket(buffer , data_size);
}
::close(sock_raw);
return 0;
}
void ProcessPacket(unsigned char* buffer, int size)
{
//Get the IP Header part of this packet
struct iphdr *iph = (struct iphdr*)buffer;
++total;
switch (iph->protocol) //Check the Protocol and do accordingly...
{
case 1: //ICMP Protocol
++icmp;
//print_icmp_packet(buffer, size);
break;
case 2: //IGMP Protocol
++igmp;
break;
case 6: //TCP Protocol
++tcp;
//print_tcp_packet(buffer , size);
break;
case 17: //UDP Protocol
++udp;
//print_udp_packet(buffer , size);
break;
default: //Some Other Protocol like ARP etc.
++others;
break;
}
printf("TCP : %d UDP : %d ICMP : %d IGMP : %d Others : %d Total : %d\r",tcp,udp,icmp,igmp,others,total);
}
我想在固定大小的数组上插入和“删除”元素。每次操作后,元素都按排序顺序且连续(无间隙)。
第一个元素将被插入到中间。
是否有现有的容器(包括 Boost)可以做到这一点?我可以写一些逻辑,但这肯定是一个不常见的要求?
我可以在上面添加一些附加/非普通逻辑。