Вярно ли е, че бинарните файлове като изпълнимите са съставени от символи и символът за отстраняване на грешки е един вид от тях?
Как да разберем символа?
Вярно ли е, че бинарните файлове като изпълнимите са съставени от символи и символът за отстраняване на грешки е един вид от тях?
Как да разберем символа?
Следва обяснение на много високо ниво:
Първо символите не са само в света на C++. Те съществуват в двоични файлове на няколко езика на високо ниво като C, C++ и т.н., когато са изградени с някои определени настройки. Да вземем определението
'int i = 2;'
В двоичния файл „i“ е просто място в паметта (напр. 0x10203040), което се инициализира с 2. Няма място в паметта, наречено „i“. Името „i“ се присвоява на това място в паметта по силата на символи за отстраняване на грешки, които се зареждат с двоични файлове (когато са изградени с определени флагове), които поддържат карта на „местоположение в паметта“ към „имена на ниво източник“.
Като пример, PE файловият формат има разпоредба за директория за отстраняване на грешки, която съхранява информация за символи за отстраняване на грешки . Те са много полезни при отстраняване на грешки, защото при липса на такива символи за отстраняване на грешки, отстраняването на грешки само по отношение на binray 0s и 1s би било наистина много много предизвикателна задача. Така че, когато дебъгвате такъв двоичен файл (който има горната дефиниция на „i“), който е изграден с флагове за отстраняване на грешки, дебъгерът знае, че мястото в паметта „0x10203040“ съответства на „i“ по силата на директорията за отстраняване на грешки в PE файл.
Хм, не. Изпълнимите файлове съдържат машинен код. И стойности за инициализация за глобални променливи. В Windows информацията за отстраняване на грешки обикновено се съхранява в отделен файл, .pdb. Част от данните за отстраняване на грешки от този файл за функция или променлива във вашата програма се нарича символ.
API dbghelp е описан тук.