小编Emp*_*ian的帖子

小C程序中的分段错误

我正在写一个C程序.它编译得很好,但是当我尝试运行二进制文件时,我遇到了一个seg错误.我运行gdb但是我在下一行遇到了问题

*total = a;
Run Code Online (Sandbox Code Playgroud)

问题出在代码的开头.这里是:

main(){
  int a[] = {1,1,1,0,0,0,0};
  int **total; //array of int arrays
  *total = a; //i.e. set total's first array to be a.
Run Code Online (Sandbox Code Playgroud)

我是C和指针的新手.任何帮助,将不胜感激.

c pointers segmentation-fault

4
推荐指数
1
解决办法
241
查看次数

GNU ld 的 --audit 标志有什么作用?

我有一个应用程序,我想使用rtld-auditLinux 提供的接口来挂钩共享库加载过程。如果我在运行程序时使用LD_AUDIT环境变量告诉动态链接器使用我的审计库audit.so,这将非常有效。

但是,我想让它更加自动化,不需要特殊的环境设置。GNUld提供了一个--audit标志,描述如下:

--audit AUDITLIB
Run Code Online (Sandbox Code Playgroud)

将 AUDITLIB 添加到动态部分的“DT_AUDIT”条目。不会检查 AUDITLIB 是否存在,也不会使用库中指定的 DT_SONAME。如果多次指定,“DT_AUDIT”将包含要使用的以冒号分隔的审计接口列表。如果链接器在搜索共享库时发现带有审计条目的对象,它将在输出文件中添加相应的“DT_DEPAUDIT”条目。此选项仅在支持 rtld-audit 接口的 ELF 平台上有意义。

这向我表明,如果我使用 链接我的程序--audit audit.so,那么它应该将我的审计库与该程序相关联。我希望在程序运行时加载审计库。

果然,使用readelf,我可以验证使用这个标志会导致audit.so在 ELF 标头中注册为审计库。但是,如果我在没有LD_AUDIT设置的情况下运行我的程序,则永远不会调用审计库。似乎我必须设置LD_AUDIT=audit.so才能获得我想要的行为。

这就引出了一个问题:--audit旗帜实际上有什么作用?上面手册页引用之外的任何文档似乎都非常稀缺。我不清楚 Linux 动态加载器甚至使用DT_AUDITELF 标头中的字段。这是故意的吗?

linux glibc shared-libraries elf ld

4
推荐指数
1
解决办法
619
查看次数

如何避免c开发过程中的内存泄漏

我想用C编程.我想知道在开发本身时我们应该遵循什么样的做法来避免内存泄漏.请提及在处理字符串和动态内存分配时要特别注意的事项.

c linux gcc memory-leaks

3
推荐指数
2
解决办法
949
查看次数

gdb 调试共享库 <optimized out> 问题

我正在尝试使用 gdb 来调试共享库

当进入共享库中的函数时,我开始获取<optimized out>所有局部变量(用 C 编写)

我尝试链接到共享库(.so),链接到静态库(.a),确保在 Makefile 中没有设置优化,即为库和库线束设置 -O0 和 -g

奇怪的事情我以前能够调试它,<optimized out>最近才出现,但我不知道为什么,例如我最初能够看到局部变量

我知道这是一个模糊的问题,我可能需要提供各种进一步的信息来对其进行排序,例如 Makefile、源代码等,但可能有人从这个高级描述中认识到问题并可以提供潜在的解决方案?

c gdb

3
推荐指数
1
解决办法
751
查看次数

C++ __glibcxx* 函数调用的目的是什么?

在 C++ STL 的实现文件中,我看到了很多函数,比如__glibcxx_class_requires__glibcxx_requires_nonempty。这些类型的函数有什么作用?如果我正在实现一个符合 STL 标准的新容器,我应该将这些包含在我自己的文件中吗?

c++ compiler-construction stl

3
推荐指数
1
解决办法
271
查看次数

C中的分段错误

我需要用0填充二维数组.但编译后的程序会出现此错误.怎么了?

int main()
{
    int vert[1001][1001];
    int hor[1001][1001];
    int dudiag[1416][1416];
    int uddiag[1416][1416];
    int n, k, m;
    int row, col;
    int i, j;
    int answer = 0;

    for(i = 0; i <= 1000; i++){
        for(j = 0; j <= 1000; j++){
            vert[i][j] = 0;
            hor[i][j] = 0;
        }
    }
...
}
Run Code Online (Sandbox Code Playgroud)

当循环被注释掉时,它可以正常工作.

c stack-overflow gcc segmentation-fault

3
推荐指数
1
解决办法
92
查看次数

为什么 gdb backtrace 在捕获系统调用时只显示一帧?

我试图在正在运行的程序的源代码中找到使用某些系统调用的所有位置。我设置断点如下:

catch syscall socketcall
Run Code Online (Sandbox Code Playgroud)

...工作正常。然而,当其中一个断点被实际击中时,回溯看起来总是一样的:

(gdb) bt
#0  __cp_end () at src/thread/i386/syscall_cp.s:25
Run Code Online (Sandbox Code Playgroud)

这就是她写的全部内容!为什么 GDB 不能遍历堆栈并显示一直到 的完整堆栈跟踪main

debugging gdb system-calls

3
推荐指数
1
解决办法
1238
查看次数

创建符号链接失败

我正在尝试在我的 CentOS 6.7 机器上升级 glibcxx。我做了这里给出的步骤。

现在,当我这样做时:

strings /opt/google/chrome/lib/libstdc++.so.6 | grep GLIBC
Run Code Online (Sandbox Code Playgroud)

我列出了 GLIBCXX_3.4 到 GLIBCXX_3.4.22。

为了在我的 Syantaxnet 构建中使用这个文件,我创建了一个符号链接:

ln -s /opt/google/chrome/lib/libstdc++.so.6 /usr/lib64/libstdc++.so.6
Run Code Online (Sandbox Code Playgroud)

但我收到一个错误:

ln: creating symbolic link `/usr/lib64/libstdc++.so.6': File exists
Run Code Online (Sandbox Code Playgroud)

编辑1:

我认为错误是由于相同的文件名并将 /opt/google/chrome/lib/libstdc++.so.6 重命名为 libstdc++.so.6_new。命令仍然失败。

有人可以帮我解决这个问题吗?另外,这是错误的解决方案:

/usr/local/bin/bazel: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by /usr/local/bin/bazel)
/usr/local/bin/bazel: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by /usr/local/bin/bazel)
Run Code Online (Sandbox Code Playgroud)

linux symlink centos6 syntaxnet

3
推荐指数
1
解决办法
3万
查看次数

如何在GDB的文本编辑器中打开当前行的当前文件?

ll -所有时间都不方便,并且缺少语法高亮和跳转到定义等功能.

如何在当前行上运行一个外部命令,在当前文件上打开一个编辑器(可能是像Vim这样的CLI编辑器)?

我已经知道编辑器插件集成,如下所述:https://vi.stackexchange.com/questions/2046/how-can-i-integrate-gdb-with-vim或Eclipse,但是从GDB打开编辑器具有优势它应该适用于任何编辑器,并且更轻量级,因此不太可能破坏.成本更差,例如无法设置编辑器的断点,但我很好.

gdb

3
推荐指数
1
解决办法
446
查看次数

不能插入断点。低值地址

我正在尝试调试这个简单的 C 程序:

#include <stdio.h>
int main(int argc, char *argv[]) {
    printf("Hello\n");
}
Run Code Online (Sandbox Code Playgroud)

但是当我反汇编 main 函数时,我得到了这个:

(gdb) disas main
Dump of assembler code for function main:
    0x000000000000063a <+0>:    push   rbp
    0x000000000000063b <+1>:    mov    rbp,rsp
    0x000000000000063e <+4>:    sub    rsp,0x10
    0x0000000000000642 <+8>:    mov    DWORD PTR [rbp-0x4],edi
    0x0000000000000645 <+11>:   mov    QWORD PTR [rbp-0x10],rsi
    0x0000000000000649 <+15>:   lea    rdi,[rip+0x94]        # 0x6e4
    0x0000000000000650 <+22>:   call   0x510 <puts@plt>
    0x0000000000000655 <+27>:   mov    eax,0x0
    0x000000000000065a <+32>:   leave  
    0x000000000000065b <+33>:   ret    
End of assembler dump.
Run Code Online (Sandbox Code Playgroud)

这已经很奇怪了,因为地址以前缀 4... 开头,对于 32 位可执行文件和 …

c linux debugging gdb

3
推荐指数
1
解决办法
2174
查看次数