我使用的是Ubuntu 12.04 LTS.我写了一个简单的程序如下来创建崩溃
// null.c
#include<stdio.h>
int main()
{
int *p = NULL;
int k=*p;
printf("%d",sizeof(0));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在我使用"gcc -g null.c"然后"./a.out"运行,输出正如预期的那样.
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)
现在我想使用gdb查看核心转储文件.我做了以下事情
我想在当前目录中创建核心转储.现在做什么?
我正在尝试通过Reindex API从远程 ES 2.4 集群执行重新索引操作。哪个工作是将超过 1 亿个索引文档传输到最新版本的 Elasticsearch。
对于测试用例,我正在小数据集上尝试,但我面临以下问题。
问题:
我看不到脚本的进度,即传输了多少文档以及还剩下多少文档。
如果失败,我如何恢复脚本而不是从 0 重新启动。
我正在 Linux X86_64 上工作。
我需要根据条目所代表的动态函数的名称来确定 ELF 文件中特定 PLT 条目的地址。我可以算出文件相对于地址的偏移量,但我需要能够确定地址。
如果我使用反汇编 ELF 文件,objdump -D -z elffile
我会发现 objdump 对 PLT 中的每个条目使用符号名称。(objdump从哪里获取这些地址和符号名的关系?)
例子:
0000000000000041a2b0 fileno@plt:
Run Code Online (Sandbox Code Playgroud)
如果我使用objdump -T elffile | grep fileno
我会得到这样的东西:
0000000000000 DF *UND* 00000000000000000 GLIBC_2.2.5 fileno
Run Code Online (Sandbox Code Playgroud)
我需要从“C”做的是在 ELF 文件中找到特定动态函数的 PLT 条目并获取地址。
背景是我正在修补现有的 ELF 文件,并且需要将函数调用重定向到不同的动态函数。我已经使用从 objdump 反汇编中收集的地址手动修补了 ELF 文件,并证明这适用于我的特定应用程序,我只需要能够从程序中执行此操作。我希望不必通过 objdump 反汇编程序代码来找出它如何获取 PLT 条目符号和地址。
在从书中学习汇编语言时,有一个清单显示了一些基本操作:
segment .data
a dq 176
b dq 4097
segment .text
global _start
_start:
mov rax, [a] ; Move a into rax.
add rax, [b] ; add b o rax.
xor rax, rax
ret
Run Code Online (Sandbox Code Playgroud)
使用"$yasm -f elf64 -g dwarf2 -l listing.lst listing.asm"
命令组装并链接后,"$ld -o listing listing.o"
我在 gdb 中运行了程序。每当我尝试打印变量的值时,gdb 都会显示以下错误消息:
(gdb) p a
'a' has unknown type; cast it to its declared type
Run Code Online (Sandbox Code Playgroud)
另一个变量“b”也是如此。但是,为 int 转换 'a' 或 'b' 有效:
(gdb) p (int)a
$11 = 176
(gdb) p …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用谷歌性能工具进行CPU时间分析.但是,我遇到了一些问题,我无法读取共享库文件"libprofiler.so.0"
我已经阅读了google性能工具的自述文件,手册中有3个步骤:
编译我的程序-lprofiler
.我没有遇到任何问题.
运行我的程序的二进制文件以生成配置文件结果文件.
我在这一步失败了.当我尝试运行我的二进制文件时,会出现一条错误消息:"error while loading shared libraries: libprofiler.so.0: cannot open shared object file: No such file or directory."
.
我用谷歌搜索,在这个页面中,有人说它"libprofiler.so.0"
在"/usr/local/lib"
,所以我将共享库文件复制到我的二进制文件目录,并尝试运行我的二进制文件.它仍然报告相同的错误消息.
我刚刚使用Linux大约一年,请原谅我,如果我的问题非常愚蠢.并且,提前谢谢你.
我的机器信息:
运行Ubuntu 10.04
$ uname -a
Linux minion 2.6.32-36-generic-pae #79-Ubuntu SMP Tue Nov 8 23:25:26 UTC 2011 i686 GNU/Linux
Run Code Online (Sandbox Code Playgroud)
下载源并执行以下操作:
CFLAGS="-O2 -U_FORTIFY_SOURCE -fno-stack-protector" '/home/user/Desktop/eglibc-2.11.1/configure' --prefix='/home/user/Desktop/eglibc_pristinebuild'
make -j4
export LD_LIBRARY_PATH=/lib/tls/i686/cmov:/lib:/usr/lib
Run Code Online (Sandbox Code Playgroud)
这有效:
$ ./elf/ld-linux.so.2 /bin/ls /usr
bin games include lib lib64 local sbin share src
Run Code Online (Sandbox Code Playgroud)
这失败了:
$ ./elf/ld-linux.so.2 /bin/true
Segmentation fault
Run Code Online (Sandbox Code Playgroud)
但这有效:
/lib/ld-linux.so.2 /bin/true
Run Code Online (Sandbox Code Playgroud)
False
,grep
和cat
其他我/bin
以同样的方式在segfault中尝试过的其他事情.源是否存在问题?我编译错了吗?
另外值得注意的是,我为raspberry pi(ARM)下载了正确的版本(略微更新),编译了它,并且它没有段错误.
好吧,据我所知ET_EXEC用于表示该文件是可执行文件,而ET_DYN表示该文件是一个共享库。所以可以肯定的是,我用 C 编写了一个简单的程序,但问题是readelf -h产生了以下内容:
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: DYN (Shared object file)
.
.
.
Run Code Online (Sandbox Code Playgroud)
我认为这与我使用的编译器有关,所以我对/bin 中的一些实用程序做了同样的事情,但不幸的是得到了相同的结果。那么问题来了:为什么 readelf 将可执行文件识别为共享库?
Dynamic Link
我在 Firebase 控制台中创建了一个。我在应用程序中有“引用”选项,它创建一个动态链接,并且该链接通过某些媒体共享。根据 Firebase 文档,如果尚未安装应用程序,它将打开 Play 商店并允许用户下载该应用程序。但是,一旦下载了应用程序(根据文档),它应该显示Continue
首次打开应用程序的选项,以便预期的动态链接流将起作用。但我还没有从 Play 商店收到这样的“首次安装”选项,它显示了Open
破坏动态链接并从头开始打开应用程序的选项。
生成的代码Dynamic Link
是
String e="https://myappinvite.page.link/?link=https://myappinvite.page.link/?referid=10&apn=com.learnandro&amv=16&st=Please Install the App&si="+some Image Url+"&afl=https://play.google.com/store/apps/details?id=app Package name";
Task<ShortDynamicLink> shortLinkTask = FirebaseDynamicLinks.getInstance()
.createDynamicLink()
.setLongLink(Uri.parse(e))
.buildShortDynamicLink()
.addOnCompleteListener(new OnCompleteListener<ShortDynamicLink>() {
@Override
public void onComplete(@NonNull Task<ShortDynamicLink> task) {
Uri get=task.getResult().getShortLink();
Intent sh=new Intent(Intent.ACTION_SEND);
sh.setType("text/plain");
sh.putExtra(Intent.EXTRA_TEXT,"Vi ew the Amazing Event "+get);
startActivity(Intent.createChooser(sh,"View"));
}
});
Run Code Online (Sandbox Code Playgroud)
该Manifest
文件看起来像这样
<activity android:name=".login.LoginActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category …
Run Code Online (Sandbox Code Playgroud) 考虑以下简单的 C++ 程序:
// main.cpp
#include <iostream>
int main()
{
std::cout << "Hello World" << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我使用 CMake 为该项目生成 Makefile,然后使用 GNU Make 和 g++ 进行构建。我的CMakeLists.txt
文件看起来像这样(实际上更复杂,这当然是简化的):
cmake_minimum_required(VERSION 3.20)
project(HelloWorld VERSION 1.0 LANGUAGES CXX)
add_executable(HelloWorld main.cpp)
Run Code Online (Sandbox Code Playgroud)
一切正常,但是在构建调试版本时:
cmake -DCMAKE_BUILD_TYPE=Debug ..
Run Code Online (Sandbox Code Playgroud)
我注意到使用的调试器标志是-g
。当运行make VERBOSE=1
查看使用了哪些标志时,编译时会显示以下内容main.cpp
:
[ 50%] Building CXX object CMakeFiles/HelloWorld.dir/main.cpp.o
/usr/bin/c++ -g -MD -MT CMakeFiles/HelloWorld.dir/main.cpp.o -MF CMakeFiles/HelloWorld.dir/main.cpp.o.d -o CMakeFiles/HelloWorld.dir/main.cpp.o -c /home/HelloWorld/main.cpp
Run Code Online (Sandbox Code Playgroud)
请注意-g
CMake 自动放置的用于添加调试信息的标志。
我怎样才能将其更改-ggdb3
为呢?
所以我使用 firebase 动态链接,创建了一个链接,它在 Playstore 和 appstore 中打开下载/生产应用程序。在网络上它会打开 URL,因此一切正常。
但我正在世博会管理的工作流程中进行开发。我想用动态链接的参数来做一些事情。在屏幕上显示文本等。
我如何在 expo go 应用程序上测试 firebase 动态链接。或者我需要使用模拟器来做其他事情吗?
我已经尝试过使用 expo-linking 进行一些操作,并且可以使其工作,但我不知道如何在 expo go 中获取 firebase 动态链接