我正在编写一个调试器,并且当多个线程同时击中它们时,当前正试图使断点可靠地工作.据我所知,大多数调试器通过用0xCC替换指令的第一个字节来实现断点,这也是我目前正在做的事情.但是,我没有看到任何恢复原始字节的方法,同时仍然能够阻止其他即将命中该断点的线程,而不会停止所有正在运行的线程.有没有人知道通常如何实现?暂停所有线程真的是唯一的解决方案吗?
有没有一种方法可以编写一个编译时断言来检查某种类型是否有填充?
例如:
struct This_Should_Succeed
{
int a;
int b;
int c;
};
struct This_Should_Fail
{
int a;
char b;
// because there are 3 bytes of padding here
int c;
};
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种在C中编写函数的方法,它按值返回一个字节字符串.我知道这通常是通过从堆中分配,或通过使调用者传递指向某个缓冲区的指针来解决的.但是,在我的情况下,由于性能原因,函数不能执行任何堆分配(因此没有malloc,只是alloca),并且字符串长度由函数确定,因此调用者无法知道要分配多少空间对于它,也没有定义的最大长度.我也不能将功能分成两半; 一个确定长度,一个生成字符串.
简而言之,被调用者必须是确定长度的人,在堆栈上分配字符串并填充它.当函数返回时,调用者可能需要做一些花哨的东西才能安全地存储字符串,但同样,它必须存储在堆栈中,而不需要多次调用函数.
我知道这不是好习惯,这只会用在计算机生成的C代码中.我不认为这可以在"安全"标准C中完成,因为在堆栈上分配的所有内容都是作用域并在作用域出口处死亡.但实际上,这些值仍然存在于堆栈中(至少在它们被覆盖之前),即使C标准表明读取它们是未定义的行为.有人知道在x86/x86_64上做这个的好方法吗?
c++ ×2
assembly ×1
breakpoints ×1
c ×1
debugging ×1
machine-code ×1
padding ×1
struct ×1
x86-64 ×1