AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 792721
Accepted
sdbbs
sdbbs
Asked: 2025-03-20 04:25:03 +0800 CST2025-03-20 04:25:03 +0800 CST 2025-03-20 04:25:03 +0800 CST

Como descobrir qual pacote Debian pode incluir um determinado arquivo de origem?

  • 772

Gostaria de depurar meu aplicativo em gdb, porém com fontes completas de algumas bibliotecas de sistema que eu possa precisar. Por exemplo, em um certo ponto do meu processo de depuração em gdb, chego a uma situação como:

...
(gdb) si
0x00047e28 in std::thread::detach() ()
(gdb) c
Continuing.
...
Thread 1 "myProject" received signal SIGABRT, Aborted.
raise (sig=<optimized out>) at ../sysdeps/unix/sysv/linux/raise.c:51
51      ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.

Não tenho certeza do motivo pelo qual std::thread::detach()não recebo uma sugestão de arquivo de origem (pesquisei manualmente online e descobri que está em libstdc++-v3/src/c++11/thread.cc ), mas raise()recebo o arquivo de origem e a linha ../sysdeps/unix/sysv/linux/raise.c:51.

De qualquer forma, para qualquer um desses, thread.ccou raise.c, como posso descobrir qual pacote de origem em um determinado Debian os inclui? Então eu poderia eventualmente obtê-los apt source [package]e fornecer o caminho para esses arquivos gdbconforme descrito em https://stackoverflow.com/questions/48278881/gdb-complaining-about-missing-raise-c/48287761#48287761 para que eu pudesse percorrer as linhas de origem (e especialmente ver qual função subjacente recebe como argumentos do meu código) ...

Eu tentei apt-file, mas parece que não funciona com pacotes de origem:

$ apt-file search raise.c
gnulib: /usr/share/gnulib/lib/raise.c
gnulib: /usr/share/gnulib/tests/test-raise.c

Legal, mas nenhum deles parece ../sysdeps/unix/sysv/linux/raise.c?!

$ apt-file search thread.cc
c++-annotations: /usr/share/doc/c++-annotations/examples/yo/threading/examples/functorthread.cc
libglibmm-2.4-doc: /usr/share/doc/libglibmm-2.4-doc/examples/thread/thread.cc
omniorb-doc: /usr/share/doc/omniorb-doc/examples/poa/threading/mainthread.cc
rust-src: /usr/src/rustc-1.24.1/src/libcompiler_builtins/compiler-rt/lib/asan/asan_thread.cc
rust-src: /usr/src/rustc-1.24.1/src/libcompiler_builtins/compiler-rt/lib/lsan/lsan_thread.cc
rust-src: /usr/src/rustc-1.24.1/src/libcompiler_builtins/compiler-rt/lib/msan/msan_thread.cc
rust-src: /usr/src/rustc-1.24.1/src/libcompiler_builtins/compiler-rt/lib/tsan/rtl/tsan_rtl_thread.cc
rust-src: /usr/src/rustc-1.24.1/src/libcompiler_builtins/compiler-rt/lib/tsan/tests/rtl/tsan_thread.cc
rust-src: /usr/src/rustc-1.24.1/src/libcompiler_builtins/compiler-rt/test/tsan/race_with_finished_thread.cc
rust-src: /usr/src/rustc-1.24.1/src/libcompiler_builtins/compiler-rt/test/tsan/signal_thread.cc

Ok, apt-filenovamente encontrei algo, mas todos parecem ser falsos positivos, nada corresponde ao esperado libstdc++-v3/src/c++11/thread.cc.

Então, há alguma maneira de procurar arquivos de origem como esse no Debian? Especificamente, estou no Raspbian Stretch no Raspberry Pi 3B+.

debian
  • 1 1 respostas
  • 46 Views

1 respostas

  • Voted
  1. Best Answer
    Marcus Müller
    2025-03-20T19:47:33+08:002025-03-20T19:47:33+08:00

    std::thread::detach() Não recebo uma sugestão de arquivo de origem

    Hum, isso, como o nome diz, é a biblioteca padrão C++; muito disso é modelado e será instanciado e, portanto, compilado apenas como parte do binário real que o usa. Não obter arquivos de origem para coisas que podem ou não ser internos do compilador, ou implementações de biblioteca padrão, não é tão surpreendente até agora.

    Então, você precisa pensar ao contrário: em qual binário as coisas dão errado? O backtrace idealmente lhe diria. O Debian pode lhe dizer de qual pacote binário esse binário vem, e então você pode usar isso para obter a versão de origem do Debian desse binário. Há um atalho (veja "solução sistemática").

    sysdeps/unix/sysv/linux/raise.c

    No seu caso específico: é o glibc. Sempre que você quiser depurar alguma coisa, essa é a primeira fonte de depuração que você instala, de qualquer forma. (gnulib é uma "pista falsa". É a prática, honestamente bastante questionável, de incluir algum código-fonte compartilhado em vários projetos principais do GNU. Esses arquivos podem ser do gnulib, mas foram incorporados ao glibc e potencialmente modificados.)

    $ apt-file search raise.c

    Sim, não. Usar o nome do arquivo não é uma opção para código-fonte. Eles se sobrepõem muito. apt-filepesquisa arquivos instalados , não os arquivos-fonte dos quais eles foram compilados. (que uma ferramenta de empacotamento na verdade nem consegue saber.) É por isso que ele aponta para o pacote aleatório que contém um raise.c. (Eu, de cabeça, conheço pelo menos dois raise.carquivos não relacionados. Tenho certeza de que quando você pesquisa no github por arquivos chamados raise.c, você encontrará algumas centenas a milhares. EDIT: sim, você encontra )

    Solução sistemática:

    habilite debuginfoda recuperação de símbolos de depuração no seu sistema. Em essência, é export DEBUGINFOD_URLS="https://debuginfod.debian.net"antes de você iniciar o GDB.

    • 3

relate perguntas

  • Configuração do GRUB para reconhecer diferentes ambientes de desktop (instalações) da mesma distribuição Linux

  • astyle não altera a formatação do arquivo de origem

  • Recebendo e-mail em um novo Debian fresco

  • Debian Stretch: gnome-software segfault em libgs_plugin_systemd-updates.so

  • Como digitar ü no Pinyin IME?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve